2012-02-26 11 views
1

なぜそれがこのように追加されたときにNSMutableArrayの要素の割り当てが解除されていない:なぜNSMutableArray要素が割り当て解除されていないのですか?

[map addObject:[[FLItem alloc] init]]; 

[map release]; 

とするとき、それは動作します:

FLItem *item = [[FLItem alloc] init]; 
[map addObject:item]; 
[item release]; 

[map release]; 

ここでの違いは何ですか?

P.S. FLItemのdealloc実装にはNSLogがあります。

答えて

4

あなたはこのように項目を追加する場合:

[map addObject:[[FLItem alloc] init]]; 

またはこのような:

FLItem *item = [[FLItem alloc] init]; 
[map addObject:item]; 

あなたは(それが1だ)のinitを使用して作成しNSMutableArrayも保持しているため、その保持カウントが2でありますそれ(別の1)です。

したがって、配列を解放するとアイテムが解放され、保持カウントは1になります。したがって、最初のケースでは割り当てが解除されず、[item release];を呼び出す2番目のケースでは割り当てが解除されます。あなたはおそらく最初のケースでやるべきこと

は次のとおりです。

[map addObject:[[[FLItem alloc] init] autorelease]]; 
+0

はあなたに感謝します!どういうわけか、私はinit自体がretainCountを増やさないと思っていましたが、割り当てはしましたが、今はそれがクリアです:) – osxdev12

+1

Objective Cは、init、copyまたはcreateで始まるメソッドを使ってオブジェクトを取得すると、 count +1を保持する)、後で解放する必要があります。 – sch

関連する問題