
一、RunTime的基本数据结构
基本数据结构包括:objc_object、objc_class、isa指针、method_t
1、Objc_object

2、objc_class

3、isa指针

a、isa是什么含义?isa包含了指针型isa和非指针型isa。

3、method_t
a、cache_t



runtime的基础数据结构

4、对象、类对象、元类对象
a、类对象是存储实例方法列表等信息的数据结构。
b、元类对象存储类方法列表信息的数据结构。
类对象、元类对象都是objct_class类型数据结构
实例通过isa找到相应类对象,类对象通过isa可以找到相应的元类对象同时可以访问相应的类方法;元类对象通过isa可以找到根元类对象(包括根元类对象isa也是指向根元类对象)

当我们调用类方法没有对应的实现,但是有同名的实例方法时候,这个时候会不会发生崩溃?会不会发生实际调用?
由于根元类对象superClass指针指向了根类对象,当在根元类方法中查找没有找到相应的方法,它会通过supclass指针到类对象中去找,如果有相应的方法就会调用。

打印结果都是:phone

5、缓存查找
a、缓存查找的具体流程和步骤?
缓存查找是采用哈希查找


6、消息转发


7、RunTime实战问题
a、obj foo和obj_mesgSend()函数之间有什么关系?
在消息传递过程中在编译器编译之后就会变成了obj_mesgSend()函数的第一个参数是obj,第二参数就foo的函数选择器。经过编译之后【obj foo】就会变成了obj_mesgSend()函数调用对应的参数了。
b、runtime是如何通过Selector找到对应的IMP地址的?
首先查找当前实例所对应类对象的缓存是否有selector所对应缓存IMP实现,若缓存有就把缓存IMP返回给对应调用方,若缓存没有就根据当前类的方法列表去查找这个Selector的具体IMp实现,当前类如果没有就通过当前类superclass指针逐级查找父类的方法列表来查找这个Selector所对应的IMp的实现。
c、能否向编译后的类中增加实例变量?
编译后类是不能添加实例变量的。
d、能否向动态的类中增加实例变量?
可以的。
网友评论