三、RunTime

注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正


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.png

Method-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地址的?
    先找当前实例的缓存,如果命中返回,没有返回在类的方法列表中查找,如果没有命中,在逐级查找父类的方法列表。
  • 能否向编译后的类中添加实例变量?
    不能,可以给动态添加的类添加实例变量

你可能感兴趣的:(三、RunTime)