Runtime总结

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也会被调用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • 在Objective-C里调用一个方法是这样的: 编译器会把它翻译成: id id的定义: objc_object...
    zziazm阅读 214评论 0 0
  • OC最实用的runtime总结,面试、工作你看我就足够了! 前言runtime的资料网上有很多了,部分有些晦涩难懂...
    small_Sun阅读 937评论 1 12
  • 一、什么是runtimeC++编写的程序通过编译器直接把函数地址硬编码进入可执行文件;而Objective-C无法...
    RunningTeemo阅读 275评论 0 0
  • 姓名,余青发,公司:四川盛唐建设工程有限公司 【日精进打卡第93天】 【知~学习】 《六项精进》1共94遍 《大学...
    一个人去韩国阅读 181评论 0 0