9

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

+0

に固定しているように見えます?代わりに、クラスのカテゴリでiVarsとプロパティを作成できます。 – Abizern

+0

@Abizern「NSObject」にivarsを追加するつもりですが、AFAIR ivarsはクラス拡張カテゴリにのみ追加できます。任意のものに追加することはできません。 – iHunter

+0

@Abizern本当に?あなたはどのようにカテゴリにivarを作成しますか? – jlehr

答えて

9

問題の原因が見つかりました - このバグが表示される両方のプロジェクトでNSZombieオブジェクトが有効になっていました。

私が理解する限り、ゾンビオブジェクトを有効にすると、通常のインスタンスは割り当て解除時にNSZombieに置き換えられますが、関連するすべてのオブジェクトは有効なままです。その行動に注意してください!

私は更新rdar://10636309

を作成しました:そこworkaroundはセドリックルティによってだし、この問題は、あなたがLLVM3を使用している+なぜあなたは関連オブジェクトを使用している場合、iOSの6

+0

ちょっと、NSZombieをデフォルトのままにしておかないといい理由もあります。 – jlehr

+0

@jlehrそして、他の理由は何ですか?私はいつも私のプロジェクトでそれらを可能にし、これまでに何の欠点も見ていません。何か不足していますか?ありがとうございました。 – iHunter

+1

ゾンビを有効にしておくと、さまざまな問題を隠すことができます。もちろん、アプリのメモリが大量に漏れてしまいます。 – jlehr

1

コードを埋めてきた2

アップデートは、あなたは正確に作品を掲載しました。私はあなたのdeallocの実装を書き直して、もう少し明らかにしました。ここで

- (void)dealloc 
{ 
    NSLog(@"deallocating %@", self); 
} 

は、結果のログです:

2012-01-03 06:49:39.754 ARC Stuff[47819:10103] deallocating <DeallocTester: 0x6878800> 
2012-01-03 06:49:39.756 ARC Stuff[47819:10103] deallocating <DeallocTester: 0x688b630> 

はあなたが有効にARCでコンパイルしていますか?

+0

うわー!使用しているOS/Xcodeのバージョンは? – iHunter

+0

10.7.2のXcode 4.2でこれを実行しました。 – jlehr

+0

私もそうです。新鮮なプロジェクトでもう一度チェックします。 – iHunter

関連する問題