小工具知识网

当前位置: 首页 > 行业知识 > iOS消息转发流程

行业知识

iOS消息转发流程

2026-11-06 13:31:09 来源:互联网转载

��       当向Objc对象发送消息时,如果找到对象对应的方法,就会进入消息转发流程,给开发者提供一些最后的机会处理消息无法发送问题,以免出现程序崩溃。

      

        1. 回调对象的resolveInstanceMethod方法,在这个方法中,允许开发者在运行时为指定对象添加一个方法,然后返回YES。

 // 重写 resolveInstanceMethod: 尝试添加对象方法实现+ (BOOL)resolveInstanceMethod:(SEL)sel{    if (sel == @selector(way)) {        class_addMethod([self class],sel,class_getMethodImplementation([self class], @selector(method)), "123");//使用class_addMethod动态添加方法method    }    return YES;}

      2. 若用户未重写resolveInstanceMethod, 或者未能在重写方法中正确处理,则将会调用对象的forwardingtargetForSelector方法,该方法允许用户将消息转发到一个可以接收该消息的其他对象。

//尝试将消息转发到一个新对象if (aSelector == @selector(way)) {        Friends *friends = [[Friends alloc]init];        return friends;//返回friends对象,让friends对象接受这个消息    }    return [super forwardingTargetForSelector:aSelector];}

        3. 若上一步仍然未能正确处理, 对象的methodsignnatureForSelector & forwardInvocation方法将会被调用,允许用户在抛异常前进行最后的挽救。

//最后一次尝试对消息进行转发,可尝试多个转发对象- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{    if (aSelector == @selector(way)) {        return [NSMethodSignature methodSignatureForSelector:@selector(way)];    }    return [super methodSignatureForSelector:aSelector];}- (void)forwardInvocation:(NSInvocation *)anInvocation{    SEL sel = anInvocation.selector;    Friends *f = [[Friends alloc] init];    if([f respondsToSelector:sel]) {   // 判断 Person 对象方法是否可以响应 sel        [anInvocation invokeWithTarget:f];  // 若可以响应,则将消息转发给其他对象处理    } else {        [self doesNotRecognizeSelector:sel];  // 若仍然无法响应,则报错:找不到响应方法    }}

        4. 若消息仍未能正确处理,系统则会抛出unrecognized selector 异常

上一篇:MySQL 更新执行的过程

下一篇:二狗子新版服务器怎么登?