- 博客(11)
- 收藏
- 关注
原创 KVO实现
ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _p = [Person new]; [_p WW_addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];}- (void)o
2020-09-08 11:18:24
91
原创 Runtime、Runloop
RuntimeOC的底层机制,oc中的对象调用实际上都是runtime的消息发送,达到很多在编译器确定的方法推迟到了运行时,这是oc成为动态语言的核心。消息转发,消息发送使用场景方法交换动态创建类遍历一个类中的所有属性及方法给系统分类添加属性和方法 //系统分类只会创建属性的声明字典转模型kvc/kvoRunloop使线程执行完之后不会退出,可以随时处理事件,避免占用太多资源所以runloop在没有处理消息时是保持休眠状态的本质是一个do-while的循环主线程在开始时会对应创建一
2020-08-27 16:57:36
142
原创 Weak 原理 个人学习总结
weak简单来说是一个哈希表,key为修饰对象的地址,value为指向该地址的指针数组。Weak是由runtime初始化并维护的一个weak表。在runtime的源码中由一个objc_weak文件中进行定义了weak表的结构体及相关的方法。其中结构体中定义可一个table_weak_t的一个weak的全局引用表,使用被修饰的对象的地址作为key,使用指向该地址的指针对象的数组作为key。Weak为什么会是弱引用?Weak修饰的对象不会增加该对象的引用计数,在被修饰对象被释放时会自动将指针置为nil
2020-08-27 09:09:07
355
原创 iOS APNs 个人学习总结
实现原理:手机端在APNs服务端获取deviceToken,将获取到的deviceToken发送给自己的服务端,服务端把要发送的消息以及目的device的表示打包发送给APNs端,APNs在自身已注册的Push服务的列表中找到相应的设备进行推送。...
2020-08-27 08:48:00
89
原创 iOS 多线程 个人学习总结
同步:不具备开启线程的能力,会在当前线程执行任务串行:在当前线程中顺序执行并行:不会开启新线程,在当前线程中顺序执行异步:具备开启新线程的能力,在新的线程中执行任务串行:开启一条新线程,在新线程中顺序执行并行:开启多条新线程,并且线程会重用,无序执行NSThread轻量级,使用简单,但需要手动管理线程声明周期、线程同步和线程加锁,开销大。GCD基于C的封装会自动管理线程的生命周期会自动利用更多的CPU内核NSOperation基于GCD的一个封装,更加的面相对象最大操作并发数可
2020-08-26 17:22:07
95
原创 iOS 关于代理、Block修饰符
代理:assign:使用assign来修饰delegate,在不使用delegate对象时需要手动去置为nil,在delegate对象执行完毕系统会释放掉这块内存如果使用assign则不会主动释放指针会造成野指针导致程序crashstrong:强引用,无法通过外部进行释放,会造成循环引用。Weak:在delegate对象执行完毕后会自动将指针置为nil,所以不会造成野指针的问题Block:作用域,block声明默认是在栈上,随时可能会被销毁,所以被销毁后再次调用会造成系统崩溃。所以需要使用copy
2020-08-25 15:46:47
352
原创 iOS Copy、strong的理解
使用copy修饰不可变对象没有问题,但是修饰可变对象有可能会出现crash。修饰可变对象时对其初始化,回导致对象由于没有重写非可变类的copy方法,调用的事父类的copy方法,得到的对象是一个不可变对象,在对其内部进行操作时会出现程序crash。...
2020-08-25 12:01:22
142
原创 iOS一些第三方框架
//hudXNProgressHUD//键盘(Swift版)IQKeyboardManagerSwift//键盘框架(OC版)IQKeyboardManager
2020-08-19 15:47:50
89
原创 一个简单的Swift数字图形验证码
需要一个协议控制点击事件@objc protocol GraphCodeViewDelegate: class { func didTapGraphCodeView(_ graphCodeView: GraphCodeView);}//根据服务器返回的或者自己设置的codeStr绘制图形验证码 override func draw(_ rect: CGRect) { super.draw(rect) //根据要显示的验证码字符串,根据
2020-08-19 15:45:17
359
原创 Swift cell中有一个player,tableview刷新时的黑屏问题
cell中包含一个player,tableview滑动时需要保证视频不会被重置,所以需要把cell设置为全局变量如果刷新cell中子View的UI则需要调用layoutSubViewsself.tableView.reloadSections(IndexSet.init(arrayLiteral: 4), with: .none)这样会导致cell的地址发生变化self.tableViewreloadData()这样不会使cell的地址发生变化如果在更新数据时不刷新UI,则会导致view的f
2020-08-19 15:33:26
200
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人