我想要使用NSHashTable保持包含對象的弱引用。關於其他可自定義的行爲(包括平等檢查),我需要與NSSet完全相同的行爲(所以實際上我想要一個具有弱引用的NSSet)。你能給我一個關於如何初始化這樣一個哈希表的例子嗎?與弱refrences的NSHashTable
將以下足矣: [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]
也將NSHashTable用弱引用自動刪除解分配的對象?
謝謝。
我想要使用NSHashTable保持包含對象的弱引用。關於其他可自定義的行爲(包括平等檢查),我需要與NSSet完全相同的行爲(所以實際上我想要一個具有弱引用的NSSet)。你能給我一個關於如何初始化這樣一個哈希表的例子嗎?與弱refrences的NSHashTable
將以下足矣: [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]
也將NSHashTable用弱引用自動刪除解分配的對象?
謝謝。
是的,你可以使用NSPointerFunctionsWeakMemory。 Facebook的KVOController還使用NSHashTable與選項,看到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;
}
而且,更便捷的方式,你可以使用weakObjectsHashTable
返回一個新的哈希表,用來儲存其內容的弱引用。
返回值使用該選項NSHashTableZeroingWeakMemory和NSPointerFunctionsObjectPersonality 並具有0
的初始容量的文件是有點老了,但它是真實的一個新的哈希表。見NSHipster NSHashTable & NSMapTable
NSHashTableZeroingWeakMemory: This option has been deprecated. Instead use the NSHashTableWeakMemory option
還要注意
NSHashTableWeakMemory等於NSPointerFunctionsWeakMemory
你應該注意到NSHashTable僅在OSX和iOS版不提供。 –
@SandyChapman從6.0開始,iOS上已經提供了'NSHashTable'。檢查'NSHashTable.h'頭。 – TylerTheCompiler
@DrBeardface有趣的是[文檔](https://developer.apple.com/library/mac/documentation/cocoa/reference/NSHashTable_class/Introduction/Introduction.html)並沒有說它支持那麼。 **編輯:**看起來我正在看錯文檔。 [這一個](https://developer.apple.com/library/ios/documentation/cocoa/reference/NSHashTable_class/Introduction/Introduction.html)表示支持。 –