I want to to use a NSHashTable for keeping weak references to the contained objects. Regarding other customizable behaviors(including equality check), I want the exact same behavior as NSSet(so practically I want to have a NSSet with weak references). Can you give me an example on how to initialize such a hash table?
Would following suffice:
[NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]
Also will NSHashTable with weak references automatically remove de-allocated objects?
Yes, you can use NSPointerFunctionsWeakMemory. Facebook KVOController also use NSHashTable with that option, see KVOController
- (instancetype)init
{
self = [super init];
if (nil != self) {
NSHashTable *infos = [NSHashTable alloc];
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
_infos = [infos initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];
#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
if ([NSHashTable respondsToSelector:@selector(weakObjectsHashTable)]) {
_infos = [infos initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];
} else {
// silence deprecated warnings
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
_infos = [infos initWithOptions:NSPointerFunctionsZeroingWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];
#pragma clang diagnostic pop
}
#endif
_lock = OS_SPINLOCK_INIT;
}
return self;
}
Also, for more convenient way, you can use weakObjectsHashTable
Returns a new hash table for storing weak references to its contents.
Return Value A new hash table that uses the options NSHashTableZeroingWeakMemory and NSPointerFunctionsObjectPersonality and has an initial capacity of 0.
The document is a little bit old, but it is true. See NSHipster NSHashTable & NSMapTable
NSHashTableZeroingWeakMemory: This option has been deprecated. Instead use the NSHashTableWeakMemory option
Note also that
NSHashTableWeakMemory Equal to NSPointerFunctionsWeakMemory
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With