NSHashTable & NSMapTable - NSHipsterの超意訳。
[2014-08-26 18:45]
NSSetは値を強参照でもつ。NSDictionaryは値は強参照で、キーはコピーされる。
開発者が弱参照の値を保持したいとか、NSCopyingに適合しないオブジェクトをキーにしたい場合はNSValue +valueWithNonretainedObject:を使う必要があった。
このようなケースにおいて、iOS 6(MacではOS X 10.5)以降だと、NSHashTableとNSMapTableを使用できる。
NSHashTableはNSSetの代替であり、以下の特徴がある:
NSSet/NSMutableSetは要素を強参照で保持し、ハッシュ算出と等値比較は、要素のhashとisEqual:メソッドを呼び出す事で行われるNSHashTableはMutableであり、Immutable版はないNSHashTableは要素を弱参照で保持できるNSHashTableは入力時に要素をコピーできるNSHashTableは任意のポインタを含めることができ、ハッシュ算出と等値比較はそのポインタを使う
使用例
NSHashTable * hashTable = [NSHashTable hashTableWithOptions:NSPointerFunctionsCopyIn];
[hashTable addObject:@"foo"];
[hashTable addObject:@"bar"];
[hashTable addObject:@42];
[hashTable removeObject:@"bar"];
NSLog(@"Members: %@", [hashTable allObjects]);代表的なオプションを紹介する:
NSHashTableStrongMemoryこれがデフォルトの振る舞いであり、NSSetの要素記憶域と同じである。NSHashTableWeakMemory読み書きバリアに弱参照を使う。解放されたらオブジェクトへの参照はNULLとなる。NSHashTableCopyIn入力時に要素の確保とコピーを行う。NSPointerFunctionの-acquireFunctionを参照のこと。NSHashTableObjectPointerPersonalityハッシュ値と等値比較にシフトしたポインタを使う。descriptionメソッドで使われる。
NSMapTableはNSDictionaryの代替であり、以下の特徴がある:
NSDictionary/NSMutableDictionaryはキーをコピーし、値を強参照で保持するNSMapTableはMutableであり、Immutable版はないNSMapTableはキーと値を弱参照で保持できるNSMapTableは入力時に要素をコピーできるNSMapTableは任意のポインタを含めることができ、ハッシュ算出と等値比較はそのポインタを使う
使用例
id delegate = ...;
NSMapTable * mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableWeakMemory];
[mapTable setObject:delegate forKey:@"foo"];
NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);オプションは NSHashTableと同じものが用意されている。
NSMapTableStrongMemoryNSMapTableCopyInNSMapTableObjectPointerPersonalityNSMapTableWeakMemory
NSMapTableはサブスクリプションが用意されていない。実装することは可能だろう。