2011-03-14 10 views
2
NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary 
    if (attrs == nil) { 
     attrs = [[NSMutableDictionary alloc] init]; 
     [nodeAttributes setObject:attrs forKey:UUID]; 
     [attrs release]; 
    } 

私はこのコードは作品が...私はsetObjectメソッドが参照を増やすかどうかわからない代わりに、このObjective Cの、NSMutableDictionaryの参照カウント

NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary 
    if (attrs == nil) { 
     attrs = [[NSMutableDictionary alloc] init]; 
     [nodeAttributes setObject:[attrs retain] forKey:UUID]; 
     [attrs release]; 
    } 

のこのようなものを持っているべきであると確信していないですカウント...

答えて

4

NSMutableDictionaryのsetObjectはオブジェクト(これはdocumentedです)を保持しますので、コードの最初のビットは正しく、2番目のリークがあります。スタイルワイズは、それが次の操作を行うために、読者に、より明確にすることがあります。メモリ管理単位が

if (attrs == nil) { 
    attrs = [NSMutableDictionary dictionary]; 
    [nodeAttributes setObject:attrs forKey:UUID]; 
} 

は、あなたのアプローチは、おそらくそれは(暗黙的に)使用して自動解放回避という点で優れています。

2

保持カウントは、最初のケースで増分されます。それが正しいアプローチです。

0

setObjectは保持メッセージを送信しますので、その必要はありません。

2

オブジェクトは、所有するものの所有権を主張する責任があります。そう、はい、setObject:forKey:が保持されます。これはAppleのmemory management guideで詳細に説明されています(ただし、非常に簡単です)。