0

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

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

感谢您的任何建议。

4

1 回答 1

0

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

但这是你需要知道的。

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

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

重要提示:您应该将控件连接到表格视图单元格,而不是视图控制器!您会看到,每当您的数据源使用 dequeueReusableCellWithIdentifier 向表格视图询问新单元格时,表格视图不会为您提供实际的原型单元格,而是一个副本(或者如果可能的话,将回收以前的单元格之一)。这意味着在任何给定时间都会有多个 PlayerCell 实例。如果您要将单元格中的标签连接到视图控制器上的出口,那么标签的多个副本将尝试使用同一个出口。那只是自找麻烦。(另一方面,将原型单元连接到视图控制器上的操作非常好。如果您的单元上有自定义按钮或其他 UIControls,您会这样做。)

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

于 2012-06-11T00:59:35.297 回答