【问题标题】:Using an NSMutableArray of weak pointers使用弱指针的 N​​SMutableArray
【发布时间】:2014-07-02 12:55:05
【问题描述】:

这是一个纯粹的理论问题,因此请随时提出额外的限制或提出替代问题进行讨论。

我知道在 Objective-C 中几乎所有可变的属性都应该定义为 (nonatomic, copy),但是如果我希望该属性(例如可变数组)只是一个指向对象的弱指针列表呢?被其他班级保留?例如,假设我有一个名为Concept 的类,假设所有 预期的Concept 实例已经被Concept 以外的某个类加载并保留在内存中。假设我们向每个名为relatedConceptsConcept 实例添加一个非原子NSMutableArray 属性,该属性指向保留并已存在于内存中的其他Concept 实例。

我知道 NSArrays 是强引用对象的列表,但我想要一个弱引用对象的列表。我该如何实施呢?

【问题讨论】:

  • @CrimsonChris 想要一个弱指针列表是否合理,如果是,你将如何去做?
  • 顺便说一句,您介意发表您的评论作为答案,以便我将其标记为正确吗?您的评论很有帮助
  • 我发现在一些场景中,保留一组弱引用会派上用场。我不得不为此使用弱代理推出自己的解决方案。基本上,你有一个对象数组,然后对你真正关心的对象有一个弱引用。然后弱代理需要将所有对它的调用重定向到它包装的对象。
  • “多代表”解决方案确实是这样一种场景。
  • 这是使用通知的替代方法。有了足够的封装,它就更干净了。我喜欢能够说[objectThatHasManyDelegates addDelegate:self],这就结束了。

标签: objective-c memory-management properties attributes


【解决方案1】:

一个 NSArray 总是保持对其每个项目的强引用。这是设计使然,因为数组是 nil 终止的,并且如果其中一项变为 nil,则会损坏。您所指的弱项仅适用于数组引用本身。在数组中保留“弱”项是一个高级问题。我当前的解决方案涉及使用弱代理对象,这听起来有点像您在上一段中描述的内容。是否使用副本并不重要。

我发现在某些情况下,保留一组弱引用会派上用场。我不得不为此使用弱代理推出自己的解决方案。基本上,你有一个对象数组,然后对你真正关心的对象有一个弱引用。然后弱代理需要将所有对它的调用重定向到它包装的对象。

【讨论】:

  • 指针数组无限长以致并非所有对象都可能真正留在内存中但如果遇到应该是内存的已释放对象则重新加载并将其放回?
  • 那...听起来完全不同。
  • 这是一个合理的问题吗?还是不值得实施?是否已经使用系统结构/功能完成了?
  • “无限”在计算机科学中很难表示。我建议您发布另一个问题。
  • 感谢深红。我的意思是在可变长度/大小的意义上无限。顺便说一句,我编辑了我的问题。您介意编辑您的答案以包含您对多个代表的评论吗?
【解决方案2】:

您可以为您的relatedConcepts 属性使用strong 说明符。这是为了防止该实例从您下方消失,无论它包含多少或类型的引用。

没有像“weak 指针列表”这样的可变数组。 NSMutableArray(以及NSArray)维护strong对其成员的引用。

您太担心保留的内容(有一个strong 引用)和没有保留的内容。那不是你的工作。完全有可能任何持有strong 引用的对象都可以选择释放它。同时,如果没有其他东西持有对它的strong 引用,那么您的weak 引用将为零。如果您想继续使用它,这是个坏主意。

【讨论】:

  • 如果我对内存中的同一个对象进行两次强引用,它会占用两倍的内存吗?
  • 没有。只有两个强有力的参考。
  • @Savagewood 不,它没有。这只是意味着在发布之前,这两个引用都必须为零。
  • @Savagewood 代表引用为 weak 以避免保留周期。
  • @Savagewood 保留循环是指两个对象之间具有强引用。最终结果是它们都没有被释放。
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2014-08-16
  • 2011-05-28
相关资源
最近更新 更多