当对象接收到不能处理的消息时调用的方法
当对象接收到不能处理的消息时调用的方法,下面三个方法会按顺序调用。
// 但是自己测试当对象接收到不能处理的消息时调用的方法时,会调用这个方法,在这个方法中拿到sel
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
return signature;
}
// 这个方法也会调用
// 将消息转出某对象(让这个被转出的对象接受消息)
- (id)forwardingTargetForSelector:(SEL)aSelector {
NSLog(@"MyTestObject _cmd: %@", NSStringFromSelector(_cmd));
FooClass *foo = [[FooClass alloc] init];
if ([foo respondsToSelector: aSelector]) {
return none;
}
return [super forwardingTargetForSelector: aSelector];
}
// 当对象接收到不能处理的消息时会将这个sel传到这个函数中在这个方法中添加在自己.m文件中的函数实现
+ (BOOL)resolveInstanceMethod:(SEL)aSEL {
if (aSEL == @selector(resolveThisMethodDynamically)) {
class_addMethod([self class], aSEL, (IMP)dynamicMethodIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:aSEL];
}
消息转发
/ / 用于消息转发
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ([self.someOtherObject respondsToSelector:anInvocation.selector])
[anInvocation invokeWithTarget:self.someOtherObject];
else
[super forwardInvocation:anInvocation];
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 风屋
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果