重学iOS-NSObject

作者: CatAllCat | 来源:发表于2018-10-27 01:47 被阅读0次

    在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

        本文链接:https://www.haomeiwen.com/subject/voertqtx.html