方法swizzling会影响在swizling之前创建的对象吗?



我正在搅拌UIDevice的方法,这是在我的搅拌代码之前创建的,它还会工作吗?,为什么?

我的理解是swizzling就像改变了方法被调度的路径,所以一旦你swizzling它,之后的所有调用都会受到影响,我的理解是对的吗?

您的理解是正确的:现有的对象会受到swizzling的影响,因为整个类都会受到影响。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

最新更新