iOS消息转发机制

oc调用方法流程

1.先去自己cache中查找,再去类的方法列表中查找

2.再去父类的cache中和方法列表中

//动态方法解析

3.runtime会调用resolveInstanceMethod方法和resolveCalssMethod方法给我们一次添加方法的实现的机会,在这里这调用class_addMethod方法添加方法的实现

class_addMethod([self class], sel, (IMP)aTestMethod, "v@:");

第一个参数是往哪个类里面添加方法,第二个是调用的方法选择器,第三个是方法的实现,即函数指针,指向要添加的方法的实现,第四个是返回值和参数类型Type Encoding

如果添加成功就返回YES否则返回NO

//重定向

4.在消息转发机制执行前runtime会允许我们替换方法的接受者即Target

通过forwrdingTargetForSelector:(SEL)aSelector方法

如果方法返回的是nil或者self则进入消息转发机制否则对返回的对象发送消息

5.当触发消息转发机制forwardInvocation:方法调用这里的NSInvocation里面包含消息的名字、参数、调用者、返回值等信息

在这里可以调用下面的函数更改消息的调用者

[anInvocation invokeWithTarget:someOthertarget]

[anInvocation selector] //这个获取方法选择器

anInvocation参数的由来—在调用forwardInvocation:方法之前runtime会调用methodSignatureForSelector:获取到返回的方法签名生成NSInvocation对象所以重写forwardInvocation:之前也要重写methodSignatureForSelector:方法否则会抛出异常

NSObject方法中的forwardInvocation:方法只是实现了doesNotRecognizeSelector:方法我们可以实现自己的forwardInvocation:将消息转发给其他对象

forwardInvocation:这个方法是不能识别的消息的分发中心在这里可以将不能识别的消息转发给别的对象或者将消息翻译成另外的消息或者吃掉因此没有响应也不会报错

forwardInvocation:这个方法只有在消息的接收对象无法响应的时候才会被调用,否则这个方法不会调用

[self class] , object_getClass(self),object_getClass([self class]),

1.self是实例对象时,[self class]与object_getClass(self)等价,应为前者会调用后者,object_getClass([self class]),返回的是元类

2.self是类对象的时候,[self class],返回的就是本身self ,object_getClass(self)和object_getClass([self class]),是等价的

+(id)Class

{

return self;

}

-(id)class {

return object_getClass(self);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,768评论 0 9
  • 以前知道苹果执行方法是通过消息执行的,当对应的对象或者类无法处理该消息时,苹果就会启动消息转发机制,通过这一机制,...
    海浪萌物阅读 469评论 0 0
  • 当我们像一个对象发送消息[Receiver message],Receiver没有实现该消息,即[Receiver...
    AlvinCrash阅读 872评论 1 5
  • 一>形成由来:Object-C是在C的基础上进行编写的一门动态程序语言(也称超C)。底层全部是由C语言实现的。所谓...
    silencerZiBo阅读 1,141评论 0 2
  • 消息转发机制 假设说我们声明一个类, 初始化对象, 并且在此类声明一个方法, 调用方法的时候底层是怎么处理的呢? ...
    软件iOS开发阅读 266评论 0 0