【问题标题】:Is there an NSMutableArray version of NSMapTable?是否有 NSMapTable 的 NSMutableArray 版本?
【发布时间】:2013-03-26 06:32:27
【问题描述】:

我想保留对一组UIViews 引用的mutable arrayNSMapTable 非常适合这种需求,除了一个细节......NSMapTable 想要一个它所拥有的每个值的键。

有类似NSMapArray 的东西吗?如果没有,我是否需要为我存储的所有值生成一次性唯一键?我应该使用NSUUID 来生成键名吗?

编辑:请不要说我在谈论真正的,自归零引用。 CFArrays 和 NSValue 解决方案存储引用,当它们的引用对象被释放时,它们不会自行清零……它们最终会成为垃圾指针。

【问题讨论】:

  • map 的全部意义在于它有一个key 和一个value。如果你不想要 key 部分,那么你不需要 map,你想要一个 set
  • NSSet / NSOrderdSet 及其可变版本可以为您提供无密钥服务。
  • NSSet / NSOrderdSet 只存储弱引用?

标签: ios objective-c nsmutablearray nsmutabledictionary weak-references


【解决方案1】:

您可以在 iOS 6 上尝试 NSHashTable,它类似于 NSSet,支持弱引用(NSPointerArray 看起来也不错,但文档说它在 ARC 下不支持弱引用)。

编辑:有些人似乎认为与文档所说的相反,NSPointerArray 确实在 ARC 下将弱引用归零。 OS X 10.8 Foundation Release Notes 是这么说的,尽管类文档说相反(iOS 发布说明没有说)。毕竟,这就是他们在 OS X 10.8 和 iOS 6.0 中添加+ weakObjectsPointerArray 构造函数和NSPointerFunctionsWeakMemory 选项的原因...您应该尝试...

【讨论】:

  • 那太好了,我不知道 NSHashTable。有序集合有类似的东西吗?
  • 正如我在编辑中所说,您应该尝试NSPointerArray,即使文档令人困惑,它是否在 iOS 上的 ARC 下执行零弱引用。看起来确实如此,并且文档已过时,但您绝对应该在做出假设之前尝试一下。
  • 这听起来正是我正在寻找的。来自文档:In a garbage collected environment, if you specify a zeroing weak memory configuration, if an element is collected it is replaced by a NULL value. 这并不令人困惑。
  • 是的,但 iOS 不是垃圾收集环境。还有一个大盒子写着Important: NSPointerArray does not support weak references under Automatic Reference Counting (ARC).这就是混乱所在!
【解决方案2】:

您说过将弱引用存储在数组中很重要。这可以使用 Core Foundation 数组来实现。你会在这里找到答案:Non-retaining array for delegates

【讨论】:

  • 这是迄今为止最好的答案,但是我问了这个问题,看看是否有比分类或 CFArray hacks 更好的答案。正如您可能在 cmets 中读到的那样,该方法存在许多问题(例如,引用不会自为零)。
【解决方案3】:

您所说的有点自相矛盾:一方面您说您希望它们将弱引用归零,在这种情况下,您的数组将在它们被释放后填充nil 元素。另一方面,你说你希望它像NSMapTable,它可能会在弱引用被释放后删除元素。是哪个?

如果您希望它真正将弱引用归零(这将在您的数组中留下nil 元素),一个好的解决方案是使用std::vector<id __weak>——一个C++ 向量,其元素正在归零弱引用。 ARC 将处理所有细节。

【讨论】:

  • 我的理解是nsarrays不能保存nil值
  • @yourfriendzak:嗯,这就是 OP 要求的——“自归零引用”。
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 2011-11-05
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多