Objective-c消息传递如何工作
1.检查接受消息是否为nil,如果是nil,调用nil处理程序
2.检查类缓存中是不是已经有方法实现了,如果有,直接调用
3.比较请求的选择器和类中定义的选择器,如果找到了,调用方法实现
4.比较请求的选择器和父类中定义的选择器,然后是父类的父类,以此类推,如果找到了选择器,调用方法实现,
5.调用resolveInstanceMethod:
或者resolveClassMethod:
,如果返回YES,那么重新开始,这一次对象会响应这个选择器,一般都是因为它已经调用过class_addMethod
6.调用forwardingTargetForSelector:
如果返回非nil,那就把消息发送到返回的对象上,这里不返回self,否则会形成死循环
7.调用methodSignatureForSelector:
如果返回nil,创建一个NSInvocation
并传给forwardInvocation:
8.调用doesNotRecognizeSelector:
默认的实现是抛出异常
KVO是如何实现的
KVO,键值观察者通知依赖于NSObject的两个方法:willChangeValueForKey:
和didChangeValueForKey:
。在一个被观察属性发生改变之前,willChangeValueForKey:
一定会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey:
会被调用,继而- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context
也会被调用。
网友评论