非 ARC コードの場合:
- (IBAction) messageZombie:(id)sender {
id a = [[NSObject alloc]init];
[a release];
NSLog(@"%@", [a description]);
}
これにより、ゾンビがオフの場合は EXC_BAD_ACCESS が表示され、ゾンビが有効の場合は「割り当て解除されたインスタンスにメッセージが送信されました」というメッセージが表示されます。
プロジェクトで ARC を使用している場合、割り当て解除されたオブジェクトにメッセージを確実に送信するのは少し難しくなります (結局のところ、これが ARCのポイントです)。
これは機能します:
- (IBAction) messageZombie:(id)sender {
id a = [[NSObject alloc]init];
id __unsafe_unretained b =a;
a=nil;
NSLog(@"%@", [b description]);
}
__unsafe_unretained を使っているのは一体誰なのでしょうか? しかし、NSZombies が適切にオンになっていることを確認したいだけなら、これは妥当なテスト ケースです。
コード内の疑わしい場所を探している場合は、__unsafe_unretained ポインターを探しますが、何も見つかりません*。Cocoa オブジェクトにキャストされた CoreFoundation オブジェクトに正しいキャストが使用されていることを再確認してください。
* プロジェクトが 10.7 より前の OS X バージョン、または 5.0 より前の iOS バージョンをサポートする必要がある場合、__weak ポインターを使用できないため、そのようなプロジェクトでは、__unsafe_unretained がより頻繁に使用されることが予想されます。