具有弱引用的 NSHashTable

Posted

技术标签:

【中文标题】具有弱引用的 NSHashTable【英文标题】:NSHashTable with weak references 【发布时间】:2014-06-19 15:41:31 【问题描述】:

我想使用 NSHashTable 来保持对包含对象的弱引用。关于其他可定制的行为(包括相等检查),我想要与 NSSet 完全相同的行为(所以实际上我想要一个带有弱引用的 NSSet)。你能给我一个关于如何初始化这样一个哈希表的例子吗?

以下就足够了: [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]

带有弱引用的 NSHashTable 也会自动删除解除分配的对象吗?

【问题讨论】:

您应该注意 NSHashTable 仅适用于 OSX 而不是 ios @SandyChapman NSHashTable 从 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 NSHash​Table & NSMap​Table

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

还要注意

NSHashTableWeakMemory 等于 NSPointerFunctionsWeakMemory

【讨论】:

以上是关于具有弱引用的 NSHashTable的主要内容,如果未能解决你的问题,请参考以下文章

块中具有强引用的弱变量:不创建保留循环?

强引用_弱引用_软引用_虚引用

java引用 强引用,软引用,弱引用

我们可以在 Swift 中创建具有非可选属性的类型擦除弱引用吗?

[转]Java 的强引用弱引用软引用虚引用

java对象的强引用,软引用,弱引用和虚引用