三、RunTime
2021-07-14 本文已影响0人
Miss_DQ
注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正
image.png
对象、类对象、元类对象
类对象:存储实例方法列表等信息。
元类对象:存储类方法列表等信息。
image.png
消息传递
void objc_msgSend(self,@selector(class))
void objc_msgSendSuper(super,@selector(class))
缓存查找:
例:给定值是SEL,目标值是对应bucket_t中的IMP?通过哈希查找cache_key_t -> bucket_t
当前类中查找:
1.对于已排序好的列表,采用二分查找算法查找方法对应执行函数。
2.对于没有排序的列表,采用一般遍历进行查找
父类逐级查找:
image.png
消息转发
image.pngMethod-Swizzing
方法交换
动态添加方法
erformSelector:编译时无该方法,运行时执行该方法
class_addMethod(self,@selector(test),testImp,@"v@:");
动态方法解析
@dynamic 运行时给属性添加setter和getter方法
- 动态运行时语言将函数决议推迟到运行时。
- 编译时语言在编译期进行函数决议。
Runtime实战
- [obj foo]和objc_msgSend()函数之间有什么关系?
运行时[obj foo]实际执行的是objc_msgSend(self ,@selector(foo)); - runtime如何通过Selector找到对应的IMP地址的?
先找当前实例的缓存,如果命中返回,没有返回在类的方法列表中查找,如果没有命中,在逐级查找父类的方法列表。 - 能否向编译后的类中添加实例变量?
不能,可以给动态添加的类添加实例变量