当用MethodSwizzling替换子类中未重写的父类方法实现时,class_getInstanceMethod会获取到子类没有重写的父类方法的Method,这个Method对应的是父类中的方法,用这个Method调用method_exchangeImplementations实现MethodSwizzling之后就会交换父类Method和子类Method的实现。然后在基类对象上调用被交换的方法时,如果该方法调用了自身就会引起unrecognizedselector异常。提问后追加:1.我知道unrecognizedselector异常出现的原因;2.“这种情况”指的是子类没有重写父类的方法,但是代码中又需要针对这个特定子类及其派生类重写方法实现的情况。具体情景可以参照:需要在UITableViewCell类及其子类上重写NSObject实现的方法setValue:forKeyPath:,而又不影响UITableViewCell的基类的方法调用结果。问:在这种情况下,如何“更优美”地达到重写不能修改源码的特定方法的目的呢?示例代码如下:#类声明@interfaceBaseClass:NSObject-(void)baseVersionMethod;@end@interfaceSubClass:BaseClass@end@interfaceSubClass(MySubClass)-(void)myMethod;@end#类定义@implementationBaseClass-(void)baseVersionMethod{NSLog(@"baseVersionMethodhasbeencalled.");}@end@implementationSubClass@end@implementationSubClass(MySubClass)-(void)myMethod{NSLog(@"myMethod");[selfmyMethod];}+(void)load{MethodoriM=class_getInstanceMethod(SubClass.class,@selector(baseVersionMethod));MethodnewM=class_getInstanceMethod(SubClass.class,@selector(myMethod));method_exchangeImplementations(oriM,newM);}@end#调用交换后的方法intmain(intargc,char*argv[]){BaseClass*obj=[[BaseClassalloc]init];[objbaseVersionMethod];//抛出unrecognizedselector异常}
慕的地10843
当年话下
相关分类