Arc:为多个按钮设置对nil的引用

时间:2012-07-18 13:37:08

标签: iphone ios xcode ios5

在ViewController中显示诸如按钮之类的项目时,我在头文件中声明它:

@property (nonatomic, strong) UIButton *startButton;

在实现文件中合成它:

@synthesize startButton;

在实施文件中启动它:

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

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

[self setStartButton:nil];

然而,如果我有60个列出的项(在UIScrollView中),这是在循环中动态创建的,在viewDidLoad中(从Core Data提供)? (不使用TableView,因为这些项目非常复杂和交互。)

我应该先在任何地方申报这些物品吗? 我应该把它们设置为零吗?(或者我应该保持手指交叉并向Arc祈祷?)

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

3 个答案:

答案 0 :(得分:5)

您的视图控制器是否具有指向这60个项目中的每一个的属性或实例变量?

是:然后在-viewDidUnload中将这些ivars或属性设置为nil。

否:然后没什么值得担心的。

ARC更改你要做的事情来管理内存,但它并没有改变基本原则,即每个对象都应该处理自己对其他对象的引用,但不要担心别人的

在这种情况下,包含所有这些项的视图将具有对项的强引用(通过它的子视图数组)。当视图控制器释放其视图时,该视图将被释放并在该过程中释放其所有子视图。因此所有这些项目都将得到妥善处理。如果您确实对这些项中的任何项都有强引用,那么这些引用将阻止引用的对象被释放 - 将引用设置为nil将避免这种情况。

答案 1 :(得分:1)

如果您即时创建这些视图并将其添加为scrollView的子视图,则无需执行任何其他操作。

-viewDidUnload期间发布scrollView时,它会正确清理其所有子视图。


<强>更新

这样想。在故事板上的常规视图设置中,您不需要为每个视图都拥有属性,只需要控制器与之交互的视图。这基本上是一回事。您有一堆嵌入到superview中的视图。如果控制器没有与它们交互,那么您不必担心它们。

答案 2 :(得分:0)

没有。 :)

当你使用nil时,你肯定会将所有指针设置为 ARC 不再需要的。 当没有更多ARC指针尝试保持对象的活动时,strong将释放当前对象的内存。如果你没有将它们设置为nil ARC认为你仍在使用它们,它们将在内存中,它们将导致严重的内存泄漏。

更新#1

如果你有任何关于按钮的参考,这是最简单的方法,你不需要设置nil任何东西,因为他们的superviewretain他们你应该从他们的superview中删除。

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

如果你将指针存放在任何其他位置(例如NSArray中),你必须从它们中删除指针。