1

在 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(从核心数据提供)中呢?(不使用 TableView,因为这些项目非常复杂且具有交互性。)

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

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

4

3 回答 3

5

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

是:然后将这些 ivars 或属性设置为 nil 在您的-viewDidUnload.

不:那就没什么好担心的了。

ARC 改变了你管理内存的方式,但它并没有改变基本理念,即每个对象都应该处理自己对其他对象的引用,而不必担心其他对象的引用。

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

于 2012-07-18T13:59:30.897 回答
1

如果您正在动态创建这些视图并将它们添加为滚动视图的子视图,那么您无需执行任何其他操作。

当 scrollView 在 期间释放时-viewDidUnload,它会正确清理其所有子视图。


更新

这样想吧。在故事板上的普通视图设置中,您不需要为每个视图都有一个属性,只需要与控制器交互的视图即可。这基本上是一样的。您有一堆嵌入到超级视图中的视图。如果控制器不与它们交互,那么您无需担心它们。

于 2012-07-18T13:55:55.947 回答
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例如),您也必须从它们中删除指针。

于 2012-07-18T13:47:31.083 回答