2009-08-11 9 views
0

私は文字列と共に任意のオブジェクトを格納しなければならないクラスを実装しています。すなわちオブジェクトを保持せずにオブジェクトと文字列のペアを格納する方法と、使用するストレージの種類は何ですか?

myUIViewObject, @"that's a nice view" 
myUIViewController, @"not really special" 
myOtherObject, @"very important one" 

このリストは拡張され、変更された時点で、私はここにNSMutableDictionaryの使用について考えることができます。

- (NSString*)checkObjNoteStringForObject:(id)anyObjectInList; 

他に:しかし、私はつまり、私はそうのようにそれを求めるときに容易myUIViewControllerまたはmyOtherObjectのための一致する文字列を見つけたい、

オブジェクトがキーでなければなりません...本当にわかりません問題は、オブジェクトがその "リスト"に追加されたときに、そのためにオブジェクトが保持されないようにすることです。 NSMutableDictionaryは内容を保持していますか?私はちょうどこの不要な振る舞いを元に戻すために後で-releaseを送ることができます。それとももっとエレガントな方法がありますか?

あなたはどう思いますか?皆さんありがとう!

答えて

0

辞書キーが保持されていない場合、一度割り当てが解除されると、辞書へのアクセスは未定義の動作になります(実際には、辞書がヒットした場合にクラッシュします)。必要なことをするには、必要に応じて辞書からオブジェクトを削除する戦略が必要です。

たとえば、オブジェクトの-deallocを上書きしてそこから削除する場合は、+[NSValue valueWithNonretainedObject:]を使用して必要な操作を行うことができます。 NSValueはオブジェクトを保持せずにオブジェクトを参照し、辞書はNSValueをコピーします(キーはコピーされ、保持されません)。辞書に何かを見たいときはいつでも、NSValueを作成してください。ヘルパー関数やメソッドは良い考えです。

+0

キー(この場合はNSValue)がコピーされると、NSValueによって参照されるオブジェクトもコピーされません。オブジェクトの中には大きなメモリフットプリントがあるものもあるので、オブジェクトがコピーされると悪いことになります。 –

+0

いいえ。NSValueはタイプ情報が添付された単なる「ビットオブバッグ」なので、真のコピーはポインタをあなたのオブジェクトにコピーするだけです。 NSValueは不変なので、-copyの実装は単に-retainを呼び出すだけです。しかし、独自のオブジェクトをキーとして使用している場合は、区別が重要になります。彼らはNSCopyingプロトコルを実装する必要があります。 –

関連する問題