专栏名称: Adrenine
iOS开发
目录
相关文章推荐
广州广播电视台  ·  早安广州丨“蝴蝶”走了,高温来了……广州仍有 ... ·  3 小时前  
深圳教育  ·  广东首枚奖牌!她们来自深圳学校! ·  昨天  
深圳教育  ·  广东首枚奖牌!她们来自深圳学校! ·  昨天  
羊城晚报  ·  注意防御!广州启动暴雨Ⅳ级应急响应 ·  昨天  
湛江日报  ·  广东将新增一所大学!今年开启招生→ ·  3 天前  
湛江日报  ·  广东将新增一所大学!今年开启招生→ ·  3 天前  
51好读  ›  专栏  ›  Adrenine

Objective C 中Self 和 Super 详解

Adrenine  · 掘金  ·  · 2017-12-13 08:46

正文

请到「今天看啥」查看全文


, [self class]); NSLog(@ "super' class is %@" , [super class]);

这样在调用时,会打出来这两个的class,先猜下吧,会打印出什么?按照以前oop语言的经验,这里应该会输出:

self ' s class is PersonMe  
super ' s class is Person 

但是编译运行后,可以发现结果是:

self 's class is PersonMe  
super ' s class is PersonMe 

self 的 class 和预想的一样,怎么 super 的 class 也是 PersonMe?

真相

self 是类的隐藏的参数,指向当前当前调用方法的类,另一个隐藏参数是 _cmd,代表当前类方法的 selector。这里只关注这个 self。super 是个啥?super 并不是隐藏的参数,它只是一个“编译器指示符”,它和 self 指向的是相同的消息接收者,拿上面的代码为例,不论是用 [self setName] 还是 [super setName],接收“setName”这个消息的接收者都是 PersonMe* me 这个对象。不同的是,super 告诉编译器,当调用 setName 的方法时,要去调用父类的方法,而不是本类里的。

当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法

One more step

这种机制到底底层是如何实现的?其实当调用类方法的时候,编译器会将方法调用转成一个 C 函数方法调用,Apple 的 objcRuntimeRef 上说:







请到「今天看啥」查看全文