Na przykład, rozważmy następujący kod poniżej łuku:metody Swizzling, że niejawnie zwrócić zatrzymane obiekt pod ARC
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@implementation NSDate (MyEvilHack)
+ (void)load {
Method originalMethod = class_getInstanceMethod(self, @selector(copyWithZone:));
Method newMethod = class_getInstanceMethod(self, @selector(myCopyWithZone:));
method_exchangeImplementations(originalMethod, newMethod);
}
- (id)myCopyWithZone:(NSZone *)zone {
id result = [self myCopyWithZone:zone];
// do customization
return result;
}
@end
W tym kodzie, oryginalne copyWithZone:
metoda jest domyślnie zwraca zatrzymany obiektu, ponieważ należy do copy
rodzina metod. Ale mój myCopyWithZone:
nie jest.
Spodziewam się awarii, ale wygląda na to, że ten kod działa normalnie. Oczywiście mogę zmienić nazwę mojej metody, aby uniknąć nieporozumień. Ale ciekawi mnie, co dokładnie dzieje się pod maską?