Например, давайте рассмотрим следующий код под АРК:методы Swizzling, которые неявно возвращают удерживаемой объект под АРК
#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
В этом коде, оригинальный copyWithZone:
метод неявно возвращает удерживаемой объект, так как он принадлежит к copy
способ семья. Но мой myCopyWithZone:
нет.
Я ожидаю аварии, но похоже, что этот код работает нормально. Конечно, я могу переименовать свой метод, чтобы избежать путаницы. Но мне любопытно, что именно происходит под капотом?