OC - Runtime 一点思考

class_addMethod
1.Sel在 class 中有实现了就不能成功; Sel在class中没有Imp就能添加成功(即使有定义)
2.class单指本类,和superclass无关 (即使superClass 实现了Sel,也可以添加成功)

method_getImplementation
获取的实时的Imp

super (self中的super调用还是本身,和super本质有关)

struct objc_super { id receiver; Class superClass; };

receiver --> 当前类 (self)
superClass ---> 这个类的父类

实际上只是一个”编译器标示符”,它负责告诉编译器,当调用viewDidLoad方法时,去调用父类的方法,而不是本类中的方法。
不是调用objc_msgSend函数,而是调用objc_msgSendSuper函数
id objc_msgSendSuper ( struct objc_super *super, SEL op, ... );

特殊情况:

  1. [obj performSelector:@select(method)] 和 [obj method] 意思一致,可是调用本质上不一样。
    特别是obj --> super
    说明:
    [super viewDidLoad] 调用的是superClass的方法, 数据是Self
    [super performSelector:@select(viewDidLoad)] 调用的是self的方法 (respondsToSelector 也是同效果)

    所以不要用:
    super, respondsToSelector和performSelector 组合, 会形成死循环

  1. 可能调用的是 super performSelector ; performSelector 中的方法中调用的是 subClass类的实现
  2. 用 self去调用 super的Sel的Imp (self 提供的数据)

[super respondsToSelector:@selsector(methodOnlyInSub)]

objc_msgSendSuper(objc_super *super, @selector(respondsToSelector:) ) --> 判断出super有

--> 可能 objc_msgSend(objc_super.receiver, @selector(respondsToSelector:)) = objc_msgSend(self,@selector(respondsToSelector:)) --> 在 respondsToSelector 方法里,就成了
objc_msgSend(self, @(methodOnlyInSub)) 在self 类方法中找实现

调用 objc_msgSendSuper 的方法,将这个结构体和 respondsToSelector 的 sel 传递过去。函数里面在做的事情类似这样:从 objc_super 结构体指向的 superClass 的方法列表开始找 respondsToSelector 的 selector,找到后再以 objc_super->receiver 去调用这个 selector,可能也会使用 objc_msgSend 这个函数,不过此时的第一个参数 theReceiver 就是 objc_super->receiver,第二个参数是从 objc_super->superClass 中找到的 selector

参考
https://blog.csdn.net/likendsl/article/details/44085569

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 2,082评论 0 9
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    made_China阅读 1,274评论 0 7
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,348评论 0 7
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 849评论 0 3
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 22,027评论 3 63

友情链接更多精彩内容