ARCで奇妙なobjc_setAssociatedObject
の動作が発生しました。次のコードを考えてみましょう:Objective-C関連のオブジェクトがARCの下に漏れる
static char ASSOC_KEY;
@interface DeallocTester : NSObject
@end
@implementation DeallocTester
- (void) dealloc
{
NSLog(@"DeallocTester deallocated");
//objc_setAssociatedObject(self, &ASSOC_KEY, nil, OBJC_ASSOCIATION_RETAIN);
}
@end
@implementation AppDelegate
- (void) applicationDidFinishLaunching:(UIApplication *)application
{
NSObject *test = [[DeallocTester alloc] init];
objc_setAssociatedObject(test, &ASSOC_KEY, [[DeallocTester alloc] init],
OBJC_ASSOCIATION_RETAIN);
}
私は、それらの両方がスコープの外に出る、そして私はそれに関連付けられたオブジェクトとして別のDeallocTester
を設定し、DeallocTester
のインスタンスを作成しています。
最初のオブジェクトの-dealloc
が呼び出され、関連付けられたオブジェクトも割り当て解除されると予想されますが、"DeallocTester deallocated"
メッセージは1回だけ表示されます。 objc_setAssociatedObject
行のコメントを外して-dealloc
にすると、2番目のオブジェクトも割り当てが解除されます。
Objective-Cリファレンスには、関連するオブジェクトがオブジェクトの破棄時に自動的に割り当て解除されることが記述されています。それはコンパイラ/ ARC /何かの問題か、何か不足していますか?
更新
あなたはブランドの新しいプロジェクトからそれを実行した場合、このサンプルコードは、実際に働いています。しかし、私は2つのARC対応プロジェクトを持っています。私はいくつかの調査を行い、より良いサンプルを提供します。 ARCの下に広告を出して、私はrdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project
に固定しているように見えます?代わりに、クラスのカテゴリでiVarsとプロパティを作成できます。 – Abizern
@Abizern「NSObject」にivarsを追加するつもりですが、AFAIR ivarsはクラス拡張カテゴリにのみ追加できます。任意のものに追加することはできません。 – iHunter
@Abizern本当に?あなたはどのようにカテゴリにivarを作成しますか? – jlehr