iOS runtime消息转发机制

1、概念:

当消息的接受者找不到对应的方法selector,就会启动消息转发机制。

2、消息转发机制分为三步:

1、动态方法解析

2、备用接受者

3、完整消息转发

3、详解:

第一步:通过调用+ (BOOL)resolveInstanceMethod:(SEL)sel或者+ (BOOL)resolveClassMethod:(SEL)sel看是否对消息转发进行处理,若这一步对消息进行了处理,则消息转发结束;若未处理,则返回NO并将消息继续往下转发。

代码实现:

/** 动态添加方法  **/
+ (BOOL)resolveInstanceMethod:(SEL)sel {
    class_addMethod([self class], sel, (IMP)age, "v");
    return YES;
}

void age() {
    NSLog(@"今年18岁了。。");
}

第二步:若第一步未做处理,则会调用- (id)forwardingTargetForSelector:(SEL)aSelector对消息进行处理,看是否有对象对这个消息进行接收处理,没有则进入完整消息转发。

代码实现:

- (id)forwardingTargetForSelector:(SEL)aSelector {
    
    JZPerson *person = [[JZPerson alloc] init];
    if ([person respondsToSelector:aSelector]) { /** person里面查找实现的aSelector方法 **/
        return person;
    }
    return [super forwardingTargetForSelector: aSelector];
}

/** person.m  **/
- (void)run {
    NSLog(@"那个人在快速跑动!!!");
}

第三步:在调用- (void)forwardInvocation:(NSInvocation *)anInvocation时需要先调用- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector方法获取选择子的签名,然后在-(void)forwardInvocation:(NSInvocation *)anInvocation方法中你就可以通过anInvocation拿到相应信息做处理。

代码实现:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if ([NSStringFromSelector(aSelector) isEqualToString:@"run"]) {
        return [NSMethodSignature signatureWithObjCTypes:"v@:"]; /** type为相应类型 **/
    }
    return [super methodSignatureForSelector:aSelector];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    
    SEL selector = anInvocation.selector;
    
    JZPerson* person = [JZPerson new];
    if ([person respondsToSelector:selector]) {
        [anInvocation invokeWithTarget:person];
    }
}

 

参考文章:

1、iOS理解Objective-C中消息转发机制

2、iOS Runtime详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值