具有弱引用的 NSHashTable
Posted
技术标签:
【中文标题】具有弱引用的 NSHashTable【英文标题】:NSHashTable with weak references 【发布时间】:2014-06-19 15:41:31 【问题描述】:我想使用 NSHashTable 来保持对包含对象的弱引用。关于其他可定制的行为(包括相等检查),我想要与 NSSet 完全相同的行为(所以实际上我想要一个带有弱引用的 NSSet)。你能给我一个关于如何初始化这样一个哈希表的例子吗?
以下就足够了:
[NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]
带有弱引用的 NSHashTable 也会自动删除解除分配的对象吗?
【问题讨论】:
您应该注意 NSHashTable 仅适用于 OSX 而不是 ios。 @SandyChapmanNSHashTable
从 6.0 开始在 iOS 上可用。检查NSHashTable.h
标头。
@DrBeardface 有趣的是the docs 并没有说它支持。 编辑: 看起来我正在查看错误的文档。 This one 表示支持。
【参考方案1】:
是的,您可以使用 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的主要内容,如果未能解决你的问题,请参考以下文章