上一篇我们测试了 消息处理中的:动态解析 机制, 这篇我们来测试下 备用者转发机制。
当 + (BOOL) resolveInstanceMethod:(SEL)sel 在动态解析的时候,返回 NO 的时候,会继续查找 备用者转发机制,也就是看有没有实现 - (id)forwardingTargetForSelector:(SEL)aSelector 方法。
如果有实现 这个方法,并且返回一个新的对象,那么就会调用这个新返回对象的 对应方法。
我们实现 Dog 类的 Bark 方法,没有实现 Pig 类的 Bark方法, 但是最终调用的时候,我们去调用 Pig 的 Bark 方法,如果不进行如何处理,那么程序将会 crash, 但是如果我们实现了 备用者转发机制,那么最终调用的 会是 Dog Bark 方法。
代码如下:
@interface Dog : NSObject
-(void) Bark:(NSString *)text;
@end
@implementation Dog
-(void) Bark:(NSString *)text {
NSLog(@"The Dog is Barking : %@", text);
}
@end
@interface Pig : NSObject
@end
@implementation Pig
+ (BOOL) resolveInstanceMethod:(SEL)sel {
return NO;
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
if (aSelector == @selector(Bark:)) {
Dog * dog = [[Dog alloc] init];
return dog;
}
return nil;
}
@end
然后我们在一个类比如 View 里面调用:
-(instancetype) init {
self = [super init];
Pig * pig = [[Pig alloc] init];
[pig performSelector:@selector(Bark:) withObject:@"555"];
return self;
}
输出效果如下: