HashTables/HashMapsは、存在するデータ構造の中で最も有用なもの(そうでない場合はthe most)の1つです。そのため、Cocoaでプログラミングを学び始めるときに最初に調査したことの1つは、ハッシュテーブルからデータを作成、入力、および読み取る方法でした。
驚いたことに、私がCocoa/Objective-Cプログラミングで読んだすべてのドキュメントは、これについてあまり説明していないようです。 Java "Java.util"を使用する開発者は、あたかも身体の機能であるかのように:これにはまったく困惑しています。
したがって、誰かがハッシュテーブルのコンテンツを作成、入力、および読み取るための入門書を私に提供できたら、私はそれを大いに感謝します。
NSDictionary および NSMutableDictionary ?
そして、ここに簡単な例があります:
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:anObj forKey:@"foo"];
[dictionary objectForKey:@"foo"];
[dictionary removeObjectForKey:@"foo"];
[dictionary release];
NSHashTable を使用してみてください。
Leopard(およびCocoaの新しいガベージコレクション)を使用している場合は、 NSMapTable も確認してください。
NSDictionaryに加えて、順序や重複のないコレクションが必要な場合は、NSSetもチェックしてください。
IOS 6.0以降のSDKの NSHashTable を使用します。ハッシュテーブルはNSSetに基づいてモデル化されていますが、次の違いがあります。メンバーへの弱い参照を保持できます。そのメンバーは入力時にコピーされるか、同等性とハッシュのためにポインターIDを使用します。任意のポインターを含めることができます(そのメンバーはオブジェクトであることに制限されません)。
NSHashTable *hashTable = [NSHashTable
hashTableWithOptions:NSPointerFunctionsCopyIn];
[hashTable addObject:@"foo"];
[hashTable addObject:@"bar"];
[hashTable addObject:@100];
[hashTable removeObject:@"bar"];
NSLog(@"Members: %@", [hashTable allObjects]);
IOS 6.0以降のSDKの NSMapTable を使用します。マップテーブルは、NSDictionaryに基づいてモデル化されていますが、次の違いがあります。キーまたは値、あるいはその両方がオプションで「弱く」保持され、オブジェクトの1つが再利用されるときにエントリが削除されます。そのキーまたは値は、入力時にコピーされるか、同等性とハッシュのためにポインターIDを使用します。任意のポインターを含めることができます(その内容はオブジェクトであることに限定されません)。
id delegate = ...;
NSMapTable *mapTable = [NSMapTable
mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableWeakMemory];
[mapTable setObject:delegate forKey:@"foo"];
NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);