重学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新项目实现

后续更新中。

推荐阅读更多精彩内容

  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 1,674评论 0 7
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,045评论 0 9
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 19,608评论 3 62
  • (昨天因为离开老家,心情有些低落,竟然忘了复制过来) 今天的心情有点淡淡的忧伤。 早晨时还在老家,现在已回到自己的...
    花儿的人生记录仪阅读 32评论 0 0
  • 上高中的时候,我的数学老师是个很激进的人。他对社会上的有些人和事总是看不惯,课余时,常给我们这些傻小子们倾吐他内心...
    漂浮的孤帆阅读 247评论 1 7
  • 这块石头来自戈壁。 5月下旬,我参加了在敦煌举行的【玄奘之路】第十届戈壁越野挑战赛,在“戈十”赛程第三天临近终点的...
    春员外阅读 145评论 0 0
  • 今天下班回家,二宝就跑出来了问我妈妈你下班啦!这么早啊,一看就很高兴的样子!我说儿子今天在家都干什么了呀?他说姥姥...
    君子兰_45cf阅读 82评论 0 0