【问题标题】:Handling Memory with ARC when subclassing views子类化视图时使用 ARC 处理内存
【发布时间】:2012-06-13 23:04:42
【问题描述】:

这是一个好奇的问题(除非它被证明造成了内存泄漏,否则它是真实的)。在 ARC 之前,我经常为我的项目创建自定义 UITableViewCells,但这是我第一次有机会使用 ARC 和 Storyboards。人们经常写到,在处理 IB 分配的视图(UITextField、UIImage 等)时,ARC 的最佳实践是在 UIViewController 的 viewDidUnload 覆盖中将保存引用的属性设置为“nil”。

在这种情况下,我的问题是当您将 UIView 子类化而不是 UIViewController 时。例如 UITableViewCell。我在我的原型中设置了一个自定义表格视图单元格,并向其中添加了一些控制视图。然后,我创建了 UITableViewCell 的子类,并将其分配给原型,以便 IB 在它出队时返回。我创建了一些 IBOutlets 并将控制视图链接到这些 IBOutlets。所有相当典型的东西。我的问题是,由于我没有任何东西可以将 IBOutlets 设置为 nil,我是否造成了内存泄漏?

感谢您的建议。

【问题讨论】:

    标签: iphone ios5 memory-management automatic-ref-counting


    【解决方案1】:

    只有您才能知道是否造成了内存泄漏,因为这取决于您的结构,但您可能没有。在 arc 中,创建内存泄漏要困难得多,因为保留释放由您处理。

    但这是您需要知道的。

    首先,在视图中将事物设置为 nil 只需要在视图控制器中设置 unload 方法,但这只是因为视图控制器可能持有对视图中某些元素的 STRONG 引用。请记住,在 ARC 中,对象在没有对它们的强引用时被释放。当您使用 IB 将元素添加到视图时,此视图具有对该元素的强引用。如果您在视图控制器中为此元素另外创建了一个 STRONG 属性,那么您现在有 2 个东西指向该元素。如果存在内存不足的情况并且系统想要释放一些内存(释放不可见的视图),那就是调用 viewdidunload 时(消除对视图中元素的可能强引用以及用于该视图的其他对象)但可以很容易地重新创建)

    您可能关心的是在 UITableViewCell 上将内容连接到 IB。只要您将这些控件连接到您设计的原型单元,就可以了。请记住,此原型是该单元格中所有控件的容器,因此表应该管理这些控件的内存(当不需要时,该单元格中的所有内容都将被卸载或重用)

    重要提示:您应该将控件连接到表格视图单元格,而不是 到视图控制器!你看,每当你的数据源询问 具有 dequeueReusableCellWithIdentifier 的新单元格的表视图, 表格视图没有给你实际的原型单元格,而是一个副本(或 如果可能的话,之前的电池之一被回收)。这意味着那里 在任何给定时间将不止一个 PlayerCell 实例。如果你 将单元格中的标签连接到视图上的插座 控制器,则标签的多个副本将尝试使用 同一个出口。那只是自找麻烦。 (另一方面, 将原型单元连接到视图控制器上的操作是 完全没问题。如果您有自定义按钮或其他 单元格上的 UIControls。)

    raywenderlich.com 第 149 页 iOS5 由教程开始故事板

    【讨论】:

    • 感谢 Luis,我知道如何将控件连接到视图单元,因为我在 ARC 之前构建了自定义视图单元。我习惯于管理我的内存,当我设置强引用时,我担心我没有遵循领先的做法并且正在设计内存泄漏。我不确定在连接控件时是否应该使用弱引用或强引用,或者它是否有所作为。
    • 这对于更复杂的情况会有所不同,但您必须考虑的是,您想让谁保持该对象的活力。至于视图控制器,如果您已经知道 IB 指向元素,则不必将其设置为强,在原型单元中我不完全确定,但将其设置为强确实没有危险,因为当单元被释放时它的指针会自动取消。 (但是要小心从其他地方创建一个强指针到单元格中的元素,因为这将使该元素保持活动状态)
    • 对。你说到了我不确定的地方。我似乎没有看到任何真正的内存问题,而且可能没有。在释放视图单元格时不将属性设为 n 似乎很奇怪。
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多