iOS消息转发


title: “iOS消息转发”
date: 2016-03-22 13:48:38
tags:


消息转发这块,我学习了三次。2次看书,1次看博客。每次看的都很明白。但是由于开发中使用很少,好忘。所以这里记录下。方便日后查看。

消息转发我分2个阶段。

一 这个消息由自己(本类)来响应阶段。
  1. 当向一个A类发送未实现的消息时。A类会调用 + (BOOL)resolveInstanceMethod:(SEL)sel 这个方法,动态的添加一个Method来响应。(添加Method看下边代码)
二 由其他类来响应阶段。
  1. 当 + (BOOL)resolveInstanceMethod:(SEL)sel 方法返回NO,就会调用 - (id)forwardingTargetForSelector:(SEL)aSelector 方法,询问是否交给其他类响应此消息。(添加看下边代码)
  2. 如果 - (id)forwardingTargetForSelector:(SEL)aSelector 返回nil,调用 - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 先进行方法签名,再调用 - (void)forwardInvocation:(NSInvocation *)anInvocation 方法进行转发。

图片来自 http://www.cocoachina.com/ios/20151208/14595.html

Resize icon

void run (id self, SEL _cmd)
{
    NSLog(@"%@ %s", self, sel_getName(_cmd));
}

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
//    if (sel == @selector(run)) {
//        class_addMethod(self, sel, (IMP)run, "v@:");
//        return YES;
//    }
    return [super resolveInstanceMethod:sel];
}


- (id)forwardingTargetForSelector:(SEL)aSelector
{
//    if (aSelector == @selector(run)) {
//        return FWCar.new;
//    }
    return [super forwardingTargetForSelector:aSelector];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    NSString *sel = NSStringFromSelector(aSelector);
    if ([sel isEqualToString:@"run"]) {
        // 为转发方法手动生成签名
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }
    return [super methodSignatureForSelector:aSelector];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL sel = anInvocation.selector;
    FWCar *car = FWCar.new;
    if ([car respondsToSelector:sel]) {
        // 唤醒这个方法
        [anInvocation invokeWithTarget:car];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 以前知道苹果执行方法是通过消息执行的,当对应的对象或者类无法处理该消息时,苹果就会启动消息转发机制,通过这一机制,...
    海浪萌物阅读 470评论 0 0
  • 消息转发机制 假设说我们声明一个类, 初始化对象, 并且在此类声明一个方法, 调用方法的时候底层是怎么处理的呢? ...
    软件iOS开发阅读 266评论 0 0
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • OC具有动态语言特性,尽管OC基于C语言,这一点也是与C语言最大的区别之一。C语言在编译的时候就决定了要调用的...
    jiangamh阅读 720评论 2 4
  • 1、动态方法解析 对象在收到无法处理的消息时,会调用下面的方法,前者是调用类方法时会调用,后者是调用对象方法时会调...
    Colin_狂奔的蚂蚁阅读 424评论 1 3