5

たとえば、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:はそうではありません。

クラッシュが予想されますが、このコードは正常に動作しているようです。もちろん、混乱を避けるためにメソッドの名前を変更できます。しかし、ボンネットの下で正確に何が起こっているのか興味がありますか?

4

1 に答える 1