2014-06-19 61 views
9

我想要使用NSHashTable保持包含對象的弱引用。關於其他可自定義的行爲(包括平等檢查),我需要與NSSet完全相同的行爲(所以實際上我想要一個具有弱引用的NSSet)。你能給我一個關於如何初始化這樣一個哈希表的例子嗎?與弱refrences的NSHashTable

將以下足矣: [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]

也將NSHashTable用弱引用自動刪除解分配的對象?

謝謝。

+0

你應該注意到NSHashTable僅在OSX和iOS版不提供。 –

+3

@SandyChapman從6.0開始,iOS上已經提供了'NSHashTable'。檢查'NSHashTable.h'頭。 – TylerTheCompiler

+0

@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)表示支持。 –

回答

9

是的,你可以使用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 NSHash​Table & NSMap​Table

NSHashTableZeroingWeakMemory: This option has been deprecated. Instead use the NSHashTableWeakMemory option 

還要注意

NSHashTableWeakMemory等於NSPointerFunctionsWeakMemory