NSHashTable & NSMapTable - NSHipsterの超意訳。
[iphone] NSHashTableとNSMapTable
[2014-08-26 18:45]
NSSet
は値を強参照でもつ。NSDictionary
は値は強参照で、キーはコピーされる。
開発者が弱参照の値を保持したいとか、NSCopying
に適合しないオブジェクトをキーにしたい場合はNSValue +valueWithNonretainedObject:
を使う必要があった。
このようなケースにおいて、iOS 6(MacではOS X 10.5)以降だと、NSHashTable
とNSMapTable
を使用できる。
NSHashTable
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
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
と同じものが用意されている。
NSMapTableStrongMemory
NSMapTableCopyIn
NSMapTableObjectPointerPersonality
NSMapTableWeakMemory
サブスクリプション
NSMapTable
はサブスクリプションが用意されていない。実装することは可能だろう。