我正在调整UIDevice
的方法,这是在我的调配代码之前创建的,它仍然可以正常工作吗?为什么?
我的理解是,调整就像更改方法调度的路径一样,所以一旦你调到它,所有的调用都会受到影响,我的理解是对吗?
答案 0 :(得分:1)
您的理解是正确的:当整个班级受到影响时,现有的物品会受到混战的影响。 Objective-C方法调度不能有一个"路径"对于一个对象,另一个对象为同一类的另一个对象。每个类都有一种查找表,用于确定为选择器(方法)执行的代码。
简单的测试程序验证:
#import <objc/runtime.h>
@interface Dummy : NSObject
- (void)printSomething;
+ (void)swizzle;
@end
@implementation Dummy
- (void)printSomething
{
NSLog(@"Foo");
}
- (void)swizzledPrintSomething
{
NSLog(@"Bar");
}
+ (void)swizzle
{
Method original, swizzled;
original = class_getInstanceMethod(self, @selector(printSomething));
swizzled = class_getInstanceMethod(self, @selector(swizzledPrintSomething));
method_exchangeImplementations(original, swizzled);
}
Dummy * dummy = [[Dummy alloc] init];
[dummy printSomething]; // Prints: Foo
[Dummy swizzle];
[dummy printSomething]; // Prints: Bar