Objective-C:方法调配是否会影响在调配之前创建的对象?

时间:2015-08-28 09:55:18

标签: objective-c

我正在调整UIDevice的方法,这是在我的调配代码之前创建的,它仍然可以正常工作吗?为什么?

我的理解是,调整就像更改方法调度的路径一样,所以一旦你调到它,所有的调用都会受到影响,我的理解是对吗?

1 个答案:

答案 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