我正在搅拌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