ios-面试-OC 方法调用的过程原理

OC中的所有方法调用,最终都是转换成runtime中的一个C语言消息分发函数:

objc_msgSend(消息接收者,方法名 ,参数。。。)

这条消息发送之后,系统会在receiver的类对象的方法列表中找这个方法,如果没找到,再到receiver的父类的方法列表中找,如此直到根类至找到为止,如果还没有找到会报出错误。

(缓存:方法第一次被调用之后,方法会被存入一张缓存表,之后如果再被调用时就直接从缓存表中取出,以提高效率)。

Runtime中对调用过程做了缓存,在抛出错误之前会进行动态决议和消息转发过程。

若对象无法响应某个选择子,则进入消息转发流程:

1、动态方法解析:+(bool) resolveInstanceMethod:(SEL)selector

                               +(bool) resolvelassMethod:(SEL)selector

2、备用接受者:

(id)forwardingargetForSelector(SEL)slector  (把这条消息转发给其他对象处理)

获取方法签名进行消息转发

- (NSMethodSignature*)methodSignatureForSelector:

完整的消息转发

- (void)forwardingInvocation(NSInvocation*)invocateion

 1、通过运行期的动态方法解析功能,我们可以在需要某个方法是在将其加入类中

2、对象可以把其无法解读的某些消息转交给其他对象来处理

3、经过上述两步后,如果还是没有办法处理消息,那就启动完整的消息转发机制

参考链接https://blog.csdn.net/flover5724059/article/details/88926573

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

推荐阅读更多精彩内容

  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 6,600评论 0 7
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,849评论 1 32
  • 本文转载自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex阅读 4,177评论 0 1
  • 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的...
    lylaut阅读 4,221评论 0 4
  • 前几日,朋友在微信里建了一个群,刚被拉进群,我就被华丽的群名镇住了,我们英俊潇洒,风流倜傥的群主大人给群命名...
    蒹葭essay阅读 3,315评论 0 0