美文网首页
objective-c 的消息转发

objective-c 的消息转发

作者: Ian_ | 来源:发表于2017-03-26 01:55 被阅读205次

objc 在执行一个方法的时候是如何判断一个方法是否存在的?

  1. 从本类和父类中查找.
  2. 检查是否动态添加方法.
  3. 查看是否存在快速消息转发.
  4. 查看标准消息转发.

1-4是按照顺序进行的, 若在某个环节查到符合的方法, 下面的查找则终止.

  1. 我就不具体解释了.
  2. objc 是一门动态的语言, 它允许在运行时, 向一个类添加属性、方法等. class_addMethod、class_addIvar、class_addProperty、class_addProtocol. 具体使用就不介绍了. 需要重写 resolveInstanceMethod 方法, 在其中判断需要添加的方法, 使用class_addMethod来动态添加方法.
+(BOOL)resolveInstanceMethod:(SEL)aSEL
{
    if(aSEL == @selector(methodName)){
        class_addMethod(Class cls, SEL name, IMP imp, 
                                 const char *types) ;
        return YES;
    }
    return [super resolveInstanceMethod];
}
  1. NSObject 提供快速消息转发方法, 只要重新
- (id)forwardingTargetForSelector:(SEL)aSelector

之后, 每次在父类本类中找不到, 并且没有找到动态添加方法, 则会走该方法, 你可以在这个方法中, return 目标对象, 则目标对象执行 aSelector. 如果没有重写标准消息转发, 并且 return nil, 则会报 unrecognized selector sent to instance 这个错误.

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    Person *person = [[Person alloc]init];
    if ([person respondsToSelector:aSelector]) {
        return person;
    }
    return nil;
}

4.标准消息转发, 主要可以实现多对象同时转发

// 生成一个方法, 并存入表中
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    NSMethodSignature* signature = [super methodSignatureForSelector:aSelector];
    if (!signature) {
        signature = [yourObj methodSignatureForSelector:aSelector];
    }
    return signature; // 将一个新签名的方法放入表中
}

// 实现动态添加方法, 并执行方法
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL seletor = [anInvocation selector];
    if ([yourObj respondsToSelector:seletor]) {
        [anInvocation invokeWithTarget:yourObj];
    }
// 这里可以转发若干个你想转发的对象
}

相关文章

  • iOS理解Objective-C中消息转发机制附Demo

    iOS理解Objective-C中消息转发机制附Demo iOS理解Objective-C中消息转发机制附Demo

  • Objective-C 运行时(Runtime)解析

    Objective-C基于C语言加入了面向对象特性和消息转发,Objective-C 的消息转发需要运行时系统来动...

  • 面试题整理

    Objective-C 中的消息与消息转发 深入理解RunLoop Autorelease

  • 2018-02-01

    《Objective-C runtime系列 1》消息发送及转发机制 Objective-C是基于C,加入了面...

  • Objective-C 消息转发

    一些概念 静态绑定:在编译期就能决定运行时所应调用的函数。代表语言:C、C++等动态绑定:所要调用的函数直到运行期...

  • Objective-C 消息转发

    前文提到(https://www.jianshu.com/p/588d1d8c3ee1),消息动态方法解析时会重载...

  • Objective-C消息转发

    理论 1.消息机制 RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。 对于C语言...

  • Objective-C消息转发

    OC中调用方法就是向对象发送消息下面的代码: 如果说method方法不存在,就会出现:unrecognized s...

  • Objective-C消息转发

    1. performSelector:object performSelector在运行时调用方法,由于编译期间不...

  • Objective-C消息转发

    我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发,希望看完这篇文章时大家会彻底的明白OC的...

网友评论

      本文标题:objective-c 的消息转发

      本文链接:https://www.haomeiwen.com/subject/oyehottx.html