【问题标题】:ios confused about strong/weak referencesios 对强/弱引用感到困惑
【发布时间】:2012-07-12 14:01:06
【问题描述】:

我查看了有关强/弱引用的问题,并了解使用弱引用(父子关系)的原因。但是,我对创建父子关系的特定场景感到困惑。

例如,是否将子视图添加到 UIView 对象..创建父/子关系的示例?是什么?

到目前为止,我在项目中使用 strong 完成所有操作,但我不确定是否会遇到内存管理问题(或者如何检查是否会遇到)。

谁能提供创建父子关系的具体情况或示例?

谢谢!

编辑:事实上,我在一个显示大量数据(地图视图、图像数量、文本、按钮)的 ViewController 中遇到了一些“收到内存警告”问题。 Everything 属性有一个强指针。我需要解决这个 ViewController 的内存管理问题

【问题讨论】:

    标签: ios xcode memory-management weak-references strong-typing


    【解决方案1】:

    你的理解是倒退的。弱引用更常用于实现子父关系。他们很少对父母与孩子的关系有意义。一般来说,父母拥有孩子;这意味着强大。

    绝大多数情况下,您都需要强有力的参考。这就是为什么它是默认值。没有强引用的最常见原因是它是否会导致保留循环。例如,如果 A 对 B 有一个强引用,那么如果 B 对 A 有一个强引用,你就会有一个循环,并且两个对象都不会被释放。因此,您选择其中一个对象作为所有者,并且它具有强引用。另一个对象具有弱引用。

    最常见的情况是委托。代表几乎总是拥有它所代表的东西。所以委托对象应该对委托有一个弱引用。作为 Objective-C 中的约定,一个名为 delegate 的属性预计会很弱。 (如果这感觉倒退了,想想你在实践中如何使用UITableViewUITableViewDelegate,以及你想将哪一个视为“所有者”。)

    弱委托指针并不是一成不变的规则。有NSURLConnection等例外。如果委托对象的生命周期比委托短,那么它可以(并且通常更可取)保持强引用。

    “收到内存警告”不一定与内存管理有关。这只是意味着你使用了太多的内存。如果您有保留循环,那么您可能会泄漏内存,这将导致此警告。但这也可能是因为您只是使用了太多内存。 Instruments 中的“分配”工具是调查此问题的最佳方式。

    虽然“强”和“弱”的实现是最近对 Objective-C 的补充,但它们只是形式化并为多年来通过手动保留正确编写的代码所做的工作提供更好的语言支持。今天的所有权模式与 ARC 之前的相同。

    【讨论】:

      【解决方案2】:

      有些人整理了一个非常有用的图表,解释了何时在“共同编码”Piazza 课程中使用弱引用。它有一些很棒的图表来解释使用强/弱指针的基本内存管理。

      http://piazza-uploads.s3-website-us-east-1.amazonaws.com/attach/h3ex5vh7htrh9/h4777mrpwp17bg/h4777tczi147de/Views,%20Outlets,%20Weak%20References.pdf

      【讨论】:

      • 这里没有解释什么时候使用弱引用。它只解释了为什么 IBOutlets 是弱引用(因为使它们变得强会将它们的保留计数增加到 2,因为已经存在强引用,这是不正确的并且会导致内存泄漏)。我一直认为它是“如果您需要创建您的对象的属性,请确保它很弱”。通常,这在大多数情况下都有效。
      【解决方案3】:

      当您将子视图添加到视图时,父视图将隐藏它的子视图。是的,这是父子关系。如果您正在创建自己的 UIView 子类,您也会这样做。

      父母与孩子的关系很密切,但孩子永远不应该与父母建立密切的关系。这可能会导致保留周期,其中任何一个都不能被释放,因为它们彼此之间都有很强的联系。

      Strong 是默认值,当您使用委托模式时,您会倾向于使用weak。

      也许您应该发布有关收到的内存警告问题的更具体信息,因为这个问题与内存语义有关。

      【讨论】:

      • 您不要将weak 用于非对象。对于这些,您仍然使用assign
      猜你喜欢
      • 2016-02-21
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多