Ví dụ, cho phép xem xét đoạn mã sau dưới ARC:phương pháp Swizzling, mà mặc nhiên trả về một đối tượng giữ lại dưới 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
Trong mã này, phương pháp ban đầu copyWithZone:
là ngầm trả về một đối tượng giữ lại, vì nó thuộc về copy
gia đình phương pháp. Nhưng myCopyWithZone:
của tôi thì không.
Tôi mong đợi sự cố, nhưng có vẻ như mã này hoạt động bình thường. Tất nhiên, tôi có thể đổi tên phương pháp của mình để tránh nhầm lẫn. Nhưng tôi tò mò chính xác những gì xảy ra dưới mui xe?