在继承视图时使用ARC处理内存

时间:2012-06-11 00:10:44

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

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

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

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

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

但这是你需要知道的。

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

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

  

重要说明:您应该将控件连接到表格视图单元格,而不是   到视图控制器!你看,只要你的数据源询问   使用dequeueReusableCellWithIdentifier的新单元格的表视图   表视图不会提供实际的原型单元格,而是副本(或   如果可能的话,可以回收以前的一个单元格。这意味着那里   在任何给定时间都将有多个PlayerCell实例。如果你   将标签从单元格连接到视图上的插座   控制器,然后标签的几个副本将尝试使用   同一个出口。那只是在惹麻烦。 (另一方面,   将原型单元连接到视图控制器上的操作是   非常好。如果你有自定义按钮或其他按钮,你会这样做   在您的手机上进行UIC控制。)

raywenderlich.com Page 149 iOS5 by Tutorials Beginning Storyboards