2019笔记
-
OC中的
super
是查找父类的方法列表,完成后消息接收者还是当前对象。因为super和self的消息接收者都是自己, -
如果要指定情况下才触发
KVO
,则使用下面方法
在要监听对象的.m中实现如下方法// 不自动触发KVO,采用手动模式 + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key { return NO; }
然后在指定情况下,实现方法
[self willChangeValueForKey:@"name"]; self.object.name = @"ddd"; [self didChangeValueForKey:@"name"];
-
KVO监听的是属性的
set
方法 -
self
代表此方法的调用者,不能简单地认为就是此类,为什么方法中能用self
和_cmd
,原因在于消息发送机制,objc_msgSend(obj,SEL,param)
,第一个和第二个参数就是self
和_cmd
这两个隐藏参数。 -
如何用
KVO
监听对象的所有属性?+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key { return [super keyPathsForValuesAffectingValueForKey:key]; }
-
KVO
如何监听数组元素的变化?NSMutableArray *array = [_school mutableArrayValueForKey:@"classes"]; [array addObject:@"中二班"];
-
链式编程思想
在自定义类HMPerson
里添加方法- (HMPerson * (^)(void))deletename { return ^id() { return self; }; }
-
学习Masonry源码
把mas_makeConstraints
包裹的布局代码放到数组中,在最后通过install全部执行一遍。
通过学习Masonry
源码,我学会了链式编程的基本思想,抽象类(MASConstraint
)的使用————子类如果没重写父类方法,父类便抛出异常
补充:可以通过点语法调用对象方法 -
同步加主队列卡死的原因
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUDuDaBf-1690701738124)(2019%E7%AC%94%E8%AE%B0%20a3affff77e884fa2806adf7fb6517526/Untitled.png)]
-
GCD dispatch_barrier_async
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Ct76XRv-1690701738125)(2019%E7%AC%94%E8%AE%B0%20a3affff77e884fa2806adf7fb6517526/Untitled%201.png)]
-
GCD快速迭代方法
/** * 快速迭代dispatch_apply */ - (void)apply { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSLog(@"apply---begin"); dispatch_apply(6, queue, ^(size_t index) { NSLog(@"%zd---%@",index, [NSThread currentThread]); }); NSLog(@"apply---end"); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryWCqNN1-1690701738125)(2019%E7%AC%94%E8%AE%B0%20a3affff77e884fa2806adf7fb6517526/Untitled%202.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOOIfr71-1690701738126)(2019%E7%AC%94%E8%AE%B0%20a3affff77e884fa2806adf7fb6517526/Untitled%203.png)]
-
GCD信号量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZLWtJ7o-1690701738126)(2019%E7%AC%94%E8%AE%B0%20a3affff77e884fa2806adf7fb6517526/Untitled%204.png)]
-
当短时间内一个事件触发很多次的时候,可以用
dispatch_source_merge_data
(联结)来处理。
当同一时间,一个事件的的触发频率很高,那么Dispatch Source
会将这些响应以ADD
的方式进行累积,然后等系统空闲时最终处理,如果触发频率比较零散,那么Dispatch Source
会将这些事件分别响应。 -
需求:
label1
与label2
的字数不固定,需求是,无论label2
字数多少,label1
都不能被拉伸或者压缩需要给
label1
设置一下优先级 -
两个有名的视频播放器,都基于
FFmpeg
kxmovie
ijkplayer
-
MVVM
的理解:vc
负责把VM
绑定到View
上,还负责处理各种点击事件,监听事件等等,VM
负责处理模型数据并让view更新数据,View
负责布局视图 -
为什么iOS的视图需要
UIView
和CALayer
共同完成?
因为CoreAnimation框架是iOS和MacOS都可以用的,CALayer
可以共用,但是逻辑控制的UIView
不能共用,因为Mac是键盘控制的,iPhone是触控的,逻辑处理不一样 -
UI状态保存和恢复
在APP在后台被杀死后,可以通过UIStateRestoration
来保存当前状态,下次打开恢复