1

関連する配列として NSDictionary を使用しています (つまり、使用しているキーは任意のオブジェクトにすることができます)。NSDictionary の非常に厄介な点の 1 つは、常にキーのコピーを作成して保存することです。私のシナリオでは、後で NSDictionary からキーを取得し、いくつかの操作を行います。操作はたまたまキーのオブジェクト ID に依存します。後で取得したキーは、最初にキーとして使用したオブジェクトのコピーであるためです。後のオブジェクト ID チェックは失敗します。

私の質問は、iPhone 3.0 SDK にキーのコピーを作成しないハッシュテーブルのようなデータ構造があるかどうかです。ありがとうございました。

時代遅れの少年

4

3 に答える 3

2

キーをコピー (または保持) したくない場合は、またはカスタマイズされたキー コールバックを使用してCFDictionary提供できます。kCFTypeDictionaryKeyCallbacksNULL

オブジェクトが等しいかどうかを確認するには、-isEqual:代わりに を使用する必要があり==ます。

于 2010-01-28T09:37:59.493 に答える
1

私は最近、キーをコピーしない MutableDictionary を実現するために次のことを行いました。

-(NSMutableDictionary*)mutableDictionaryWithRetainedKeys {
    CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    return CFBridgingRelease(dictionary);
}

キーが NSCopying に従わず、キー/値を設定するときにコンパイラの警告を回避したい場合は、次を使用します。

CFDictionarySetValue(dictionary, (__bridge const void *)(key), (__bridge const void *)(value));
于 2012-12-12T15:45:17.937 に答える
1

NSDictionary は、CFDictionary と橋渡しされたフリーダイヤルです。だからただやってください:

CFDictionarySetValue((CFDictionaryRef)myMutableDict, key, object);

キーをコピーするのは Cocoa メソッドだけです。

于 2010-01-28T10:17:47.593 に答える