当方法未实现时,通过runtime有三种方案进行补救:
比如当执行ChenPerson *person = [[ChenPerson alloc] init];
[person performSelector:@selector(runAction)];
当runAction方法不存在或者没有实现时,就会crash
通过以下措施可以进行补救。
1、方案一:+ (BOOL)resolveInstanceMethod:(SEL)sel 动态方法解析。通过重写该方法,动态添加方法到对象上。
2、当方案一中的方法返回NO时。则可以用方案二:
- (id)forwardingTargetForSelector:(SEL)aSelector;作用是替换方法的执行对象。把该方法交给别的对象执行,如果返回的对象也没有实现或存在改方法,则同样会crash
3、当前面两种方案都返回NO,和返回nil时,可以用方案三:完全转发。
- (void)forwardInvocation:(NSInvocation*)anInvocation;作用是设置关联对象和执行方法。
所以需要重写:
- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector方法
为第一个方法提供NSMethodSignature对象。
forwardInvocation中传入的对象就是NSInvocation封装的NSMethodSignature对象。