たとえば、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
このコードでは、元のメソッドはメソッド ファミリcopyWithZone:
に属しているため、保持されたオブジェクトを暗黙的に返します。copy
しかし、私myCopyWithZone:
はそうではありません。
クラッシュが予想されますが、このコードは正常に動作しているようです。もちろん、混乱を避けるためにメソッドの名前を変更できます。しかし、ボンネットの下で正確に何が起こっているのか興味がありますか?