Класс Person
:
@implementation Person
- (void)sayHi {
NSLog(@"hi");
}
- (void)sayHello {
NSLog(@"hello");
}
- (void)swizzlingMethod {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL HI_SEL = @selector(sayHi);
SEL HELLO_SEL = @selector(sayHello);
Method HI_METHOD = class_getInstanceMethod(self.class, HI_SEL);
Method HELLO_METHOD = class_getInstanceMethod(self.class, HELLO_SEL);
BOOL addSuccess = class_addMethod(self.class, HI_SEL, method_getImplementation(HELLO_METHOD), method_getTypeEncoding(HELLO_METHOD));
if (addSuccess) {
class_replaceMethod(self.class, HI_SEL, method_getImplementation(HELLO_METHOD), method_getTypeEncoding(HELLO_METHOD));
} else {
method_exchangeImplementations(HI_METHOD, HELLO_METHOD);
}
});
}
@end
Когда экземпляр Person вызывается swizzlingMethod
, происходит обмен методом sayHi
и методом sayHello
.
Однако, если экземпляр называется swizzlingMethod
, метод этого экземпляра будет заменен:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
Person *person1 = [Person new];
[person1 swizzlingMethod];
[person1 sayHi];
Person *person2 = [Person new];
[person2 sayHi];
}
Консоль напечатана hello
и hello
, хотя person2 не звонил swizzlingMethod
.
То, что я хочу, это обмен только методом person1. Таким образом, любой способ может помочь достичь этого?