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]);复制代码