消息机制

对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

当OC对象调用一个方法时,动态调用,根据实例对象(本质上是一个有isa指针指向类对象的结构体)的isa指针找到实例的类对象,(如果是对象方法就在实例的类对象方法列表中,如果是类方法,则还要往上找元类)然后从方法列表中选择对应的SEL,通过SEL(选择器)调用方法,实际是SEL,只是具体实现方法的索引值(通过它找到IMP(具体实现的函数指针)

首先会去类对象的方法缓存列表中查找,如果找到了就调用该方法(实际找到的是一个函数指针(IMP),比较OC底层就是C),如果没有找到就到类对象的方法列表中查找,如果还没有找到,就到对象的父类对象中查找,重复上一步的动作,如果一直到最后还是没有找到的话,程序会崩溃

当没有找到实现方法时,会调用如下函数。

//动态方法解析

+(BOOL) resolveInstanceMethod:(SEL)selector

+(BOOL)resolveClassMethod:(SEL)sel

//备用接收者

-(id)forwardingTargetForSelector:(SEL)aSelector

//完整地消息转发

-(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector

-(void)forwardInvocation:(NSInvocation *)anInvocation


当没有找到实现方法时,OC的处理可以从下面链接找到,写得不错

IOS 消息转发 - 简书

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,872评论 0 9
  • 从异常说起 我们都知道,在iOS中存在这么一个通用类类型id,它可以用来表示任何对象的类型 —— 这意味着我们使用...
    sindri的小巢阅读 9,996评论 15 43
  • 消息机制(Messaging) 不知大家有没有想过:我们在程序中调用的方法,是怎么执行的,又是怎么通过一个方法名字...
    百客阅读 5,142评论 0 8
  • “在任何特定的环境中,人们还有一种最后的自由,那就是选择自己的态度。”——纳粹德国某集中营的幸存者维克托•弗兰克尔...
    悠游涵泳阅读 2,972评论 0 0
  • 今天,终于闲下来了。 吃完早点,和诵友们互动之后,便长长地躺在沙发上,享受着八天的小长假的开头,回想着自军训以来的...
    酒泉信天游阅读 4,164评论 2 3

友情链接更多精彩内容