NSHashTable 是 NSSet 的通用版本,和 NSSet / NSMutableSet 不同的是,NSHashTable 具有下面这些特性:
- NSSet / NSMutableSet 持有成员的强引用,通过 hash 和 isEqual: 方法来检测成员的散列值和相等性。
- NSHashTable 是可变的,没有不可变的对应版本
- NSHashTable 可以持有成员的弱引用
- NSHashTable 可以在加入成员时进行 copy 操作
- NSHashTable 可以存储任意的指针,通过指针来进行相等性和散列检查
用法
NSHashTable *hashTable = [NSHashTable hashTableWithOptions:NSPointerFunctionsCopyIn];
[hashTable addObject:@"foo"];
[hashTable addObject:@"bar"];
[hashTable addObject:@42];
[hashTable removeObject:@"bar"];
NSLog(@"Members: %@", [hashTable allObjects]);
复制代码
NSMapTable 是 NSDictionary 的通用版本。和 NSDictionary / NSMutableDictionary 不同的是,NSMapTable 具有下面这些特性:
- NSDictionary / NSMutableDictionary 对键进行拷贝,对值持有强引用。
- NSMapTable 是可变的,没有不可变的对应版本。
- NSMapTable 可以持有键和值的弱引用,当键或者值当中的一个被释放时,整个这一项就会被移除掉。
- NSMapTable 可以在加入成员时进行 copy 操作。
- NSMapTable 可以存储任意的指针,通过指针来进行相等性和散列检查。
注意: NSMapTable 专注于强引用和弱引用,意味着 Swift 中流行的值类型是不适用的,只能用于引用类型。
用法
NSMapTable *mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableWeakMemory];
[mapTable setObject:delegate forKey:@"foo"];
NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);
复制代码