OC源码分析-Runtime源码分析(四)

一 : 对象方法消息转发

当前两个阶段 都搞不定的时候调用消息转发机制.


OC源码分析-Runtime源码分析(四)_第1张图片
OC源码分析-Runtime源码分析(四)_第2张图片

如果forwardingTargetForSelector返回的是nill,或者没写,则进入methodSignatureForSelector方法,如果继续不处理返回nill,则进入doesNotRecgnizeSelector方法,报异常,

OC源码分析-Runtime源码分析(四)_第3张图片

不为nill则调用forwardinvocation方法进行处理

OC源码分析-Runtime源码分析(四)_第4张图片

二 : forwardInvocation解析

在这个方法中可以尽情处理
我们可以在这个方法中只打印

OC源码分析-Runtime源码分析(四)_第5张图片

带一个age参数

OC源码分析-Runtime源码分析(四)_第6张图片

获取一个参数

OC源码分析-Runtime源码分析(四)_第7张图片

获取调用返回值

OC源码分析-Runtime源码分析(四)_第8张图片
OC源码分析-Runtime源码分析(四)_第9张图片
OC源码分析-Runtime源码分析(四)_第10张图片
方法签名的另一种写法
OC源码分析-Runtime源码分析(四)_第11张图片

二 : 类方法消息转发

OC源码分析-Runtime源码分析(四)_第12张图片

或者

OC源码分析-Runtime源码分析(四)_第13张图片

+号方法的forwardingTargetForSelector:也可以返回实例对象,因为本质相当于 ,执行消息发送 obj_msgSend([[MJCat alloc]init],@selector(test)),相当于调用了实例对象-号方法

OC源码分析-Runtime源码分析(四)_第14张图片
OC源码分析-Runtime源码分析(四)_第15张图片

三 : dynamic

提醒编译器不要自动生成setter和getter的实现、不要自动生成成员变量

动态添加set/get方法


OC源码分析-Runtime源码分析(四)_第16张图片

四 : super 本质

super本质以及底层实现,super调用,底层会转换成objc_msgSendSuper2函数的调用,接受两个参数一个是 结构体参数 ,还有一个是方法名.

结构体表现

OC源码分析-Runtime源码分析(四)_第17张图片

案例分析

class 与 superclass方法的底层实现

[super class] 底层调用 obj_megSendSuper. 其消息接受者是self,class在NSObject中,在其class方法中的self是放调用者,也就是 obj_megSendSuper的消息接受者.
[super superclass]

OC源码分析-Runtime源码分析(四)_第18张图片

OC源码分析-Runtime源码分析(四)_第19张图片

四 : 方法转发用法

没有实现test与other方法

OC源码分析-Runtime源码分析(四)_第20张图片

你可能感兴趣的:(OC源码分析-Runtime源码分析(四))