弧:为多个button设置引用为零

在ViewController中显示一个button等项目时,我将其声明在头文件中:

@property (nonatomic, strong) UIButton *startButton; 

在实现文件中将其合成:

 @synthesize startButton; 

在实施文件中启动它:

 startButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 

并在viewDidUnload中将引用设置为nil:

 [self setStartButton:nil]; 

但是, 如果我有60个列出的项目 (在一个UIScrollView),这是在一个循环dynamic创build,viewDidLoad(从核心数据提供)? (不使用TableView,因为这些项目相当复杂和交互。)

我应该先在哪里申报? 我应该把它们设置为零吗? (或者我应该保持我的手指交叉并向弧线祈祷?)

一些指导将不胜感激。 谢谢。

你的视图控制器有属性或实例variables指向这60个项目中的每一个?

是:然后在你的-viewDidUnload设置这些ivars或属性为零。

否:那么没有什么可担心的。

ARC改变了你所要做的内存pipe理,但是它并没有改变基本的理念,即每个对象都应该照顾自己对其他对象的引用,而不用担心其他对象。

在这种情况下,包含所有这些项目的视图将具有对项目的强引用(通过它是子视图数组)。 当视图控制器释放其视图时,该视图将被释放,并释放该过程中的所有子视图。 所有这些项目都将被照顾。 如果你确实有强引用的任何这些项目,这些引用将阻止被引用的对象被释放 – 设置引用为零将避免这一点。

如果您正在dynamic创build这些视图并将它们添加为scrollView的子视图,则不需要执行其他任何操作。

当在-viewDidUnload期间释放-viewDidUnload ,它将正确地清理所有子视图。


更新

想想这样。 在故事板上的普通视图设置中,不需要每个视图都有一个属性,只需要控制器与之交互的视图。 这基本上是一样的东西。 你有一堆embedded到超级视图中的视图。 如果控制器不与他们互动,那么你不需要担心他们。

没有。 🙂

你肯定把所有的指针设置 nil 当你使用ARC不再需要

当没有更强的指针试图保持活动对象时, ARC将释放当前对象的内存。 如果你不把它们设置nilARC认为你仍然在使用它们,它们将在内存中,并且会导致严重的内存泄漏。

更新#1

如果你有任何的button引用,这是最简单的方法,你不需要做任何设置,因为他们的superviewretain它们,你应该从他们的superview删除。

 for (UIView *_subView in self.view.subviews) { if ([_subView isKindOfClass:[UIButton class]]) { [_subView removeFromSuperview]; } } 

如果你将指针存储在任何其他地方(例如在一个NSArray中),你必须从它们中删除指针。