重学iOS-NSObject

在runtime中,isEqual:方法实际实现为直接判断类的self是否相等,以“==”直接进行判断。

runtime源码实现
Xcode新项目实现

一个类的哈希值由其指针强转得出。

runtime源码实现
runtime源码实现
Xcode新项目实现

类的superclass和class指向Class(objc_class)的结构体。

runtime源码实现
runtime源码实现
runtime源码实现
Xcode新项目实现

class与superclass虽然打印值貌似意思相同,但获取方式不同,superclass直接通过结构体中superclass获取,而class通过位运算操作后,在表中读取。

runtime源码实现
runtime源码实现
runtime源码实现
runtime源码实现
Xcode新项目实现

2018-10-27更新

isProxy可以在一些情况下改变isKindOfClass:或isMemberOfClass:的返回值?默认为NO。

实际测试重写后没有改变结果。

runtime源码实现
Xcode新项目实现

消息传递一直是iOS实现原理中的重点,由于没有接触过汇编,所以底层真实实现无法得出结论。

传递消息时有四种方法,objc_msgSend,objc_msgSendSuper,objc_msgSend_stret,objc_msgSendSuper_stret,

前两种会返回原类,后两种会返回结构体。

当SEL为空时,直接崩溃。

runtime源码实现
runtime源码实现
Xcode新项目实现

2018-10-29更新

isProxy表示是否为父类代理人,默认为NO,重写为YES时在isKindOfClass:中判断与父类相等。

runtime源码实现
runtime源码实现
Xcode新项目实现

isProxy在官方文档中表示也会影响isMemberOfClass:的判断,实际测试结果没有影响。(也许需要什么特定条件?)

isMemberOfClass:为直接获取类名与传入比较,返回比较结果。

runtime源码实现
Xcode新项目实现

2018-10-31更新

conformsToProtocol:循环比较自己、父类至根类协议列表,判断是否包含协议。

中间判断了类是否被实现,若没有实现会发生崩溃。与后面有所区别。

runtime源码实现
runtime源码实现
runtime源码实现
runtime源码实现
Xcode新项目实现

后续更新中。

你可能感兴趣的:(重学iOS-NSObject)