2009-03-22 8 views
6

setValue:forKey:メソッドを使用してNSMutableDictionaryに項目を追加すると(NSObjectに一般化されると仮定します)、辞書には2番目のパラメータのNSStringが保持されますか?例えば[NSMutableDictionary setValue:value forKey:key]はNSStringキーを保持していますか?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
NSString *theString = @"hello"; 
int i; 
for (i=0; i<[theString length]; i++){ 
    NSNumber *myInt = [NSNumber numberWithInt:i]; 
    NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]]; 
    [dict setValue: myInt forKey:character]; 
} 
[dict release]; 
[pool release]; 

は明らかに、ループ内myIntを解放する理由はありませんが、それは、それがコードの最後まで解放することができないdictによって保持されます。しかし、同じことがcharacterの真実ですか?私の考えは、もしNSMutableDictionaryが他の方法で文字列を格納すると、ループの周りに一時的なプールを作成し、辞書のリリースまで待つのではなく、それらの文字列を解放することができます。

私はそれがNSConstantStringであれば、私はstringWithFormatが保持する必要があるだろうが、それはケースのように思われないNSStringオブジェクトを返すことを期待するようcharacterretainCountが7FFFFFFFである理由としても興味があります。

+0

10.4以降のコードでは、代わりに[プールドレイン]を使用することをお勧めします.GCがオンの場合、ドレインはヒントとして役立つかもしれません古い参照を収集する時間ですが、リリースはノーオペレーションになります。 GCをオフにすると、それらは同じように機能します。 –

+0

これは古い質問ですが、代わりに 'setObject:forKey:'を使用することを意味します。 [ここを参照](http://stackoverflow.com/questions/1249634/wheres-the-difference-between-setobjectforkey-and-setvalueforkey-in-nsmutabl) –

答えて

8

NSStringパラメータが保持されるのではなくコピーされるのは、ココアではよくあることです。これは、辞書にNSMutableStringのインスタンスを簡単に与えることができるからです。文字列の値が変更される可能性があるため、NSDictionaryがコピーを作成します。

しかし、NSMutableDictionaryが実際にどのように動作するかにかかわらず、characterを保持する必要があるかどうか心配する必要はありません。パラメータとしてNSMutableDictionaryに渡すと、オブジェクトの保持があなたの責任であることをドキュメンテーションが明確に示していない限り、データの格納方法を決定するのは実際にそのクラスの問題です。

また、オブジェクトのretainCountについてはあまり気にしません。オブジェクトの保持回数が少なすぎると、あなたの車輪を回転させるだけのウサギの穴ができます。

最後に、私は実際にあなた自身のオートリリースプールをここで作成する必要はないと思います。 theStringが非常に長くなることが絶対にわかっていないか、すでにInstrumentsでメモリ使用率が高いことがわかっている場合は、自動解放プールを追加することは不要です。

4

characterを保持する必要はありません。辞書をキーとして設定し、独自のコードを保持する必要がない場合は辞書に保持されます。

保持カウントが期待どおりでない理由についても心配する必要はありません。たぶんFoundationフレームワークのフライウェイトのようなインスタンスには、単一文字のロードNSStringインスタンスの負荷があります。どのような場合でも、ガイドラインに従ってメモリ管理が正しく行われていれば、フレームワークが背後で何をしているかにかかわらず、問題はありません。 http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

関連する問題