弧:设置,以零引用多个按钮(Arc: Setting references to nil, for

2019-10-17 00:52发布

时显示物品诸如在的ViewController一个按钮,我声明它在头文件:

@property (nonatomic, strong) UIButton *startButton;

合成它在实现文件:

@synthesize startButton;

启动它在实现文件:

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

并设置viewDidUnload参考为零:

[self setStartButton:nil];

但是, 如果我有 viewDidLoad中这是在一个循环中动态创建的60个上市项目 (一个UIScrollView),(从核心数据馈送)? (不使用的TableView,因为项目是相当复杂和互动。)

我应该在任何地方首先声明的项目? 我应该将它们设置为nil地方? (或者我应该让我的手指交叉,祈求弧?)

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

Answer 1:

请问您的视图控制器具有指向每个这60项的属性或实例变量?

是的:接盘者的ivars或属性为零你-viewDidUnload

无:接下来有什么可担心的。

ARC改变你做什么来管理内存,但它并没有改变基本理念,这是每一个对象应该照顾自己的引用到其他对象,但不担心别人的。

在这种情况下,它包含了所有这些项目必须将项目强引用视图(通过它的子视图数组)。 当视图控制器释放其观点,这一观点随后将被释放并释放其过程中的所有子视图。 因此,所有这些项目将得到照顾。 如果你确实有对所有这些项目的强引用,这些引用将防止被引用的对象被释放 - 设置为无参考文献将被避免。



Answer 2:

如果您是动态创建这些意见,并增加它们作为滚动视图的子视图,那么你不需要做任何事情。

当滚动视图中被释放-viewDidUnload ,它会妥善清理其所有子视图。


更新

它认为这种方式。 在上Storyboard的普通视图设置,你不需要有一个属性对每个视图,只有您的控制器与互动的意见。 这基本上是同样的事情。 你有一大堆的观点,即嵌入到上海华。 如果控制器不与他们进行互动,那么你就不需要担心。



Answer 3:

没有。 :)

你肯定设置的所有指针 nil ,当你使用什么都没有必要再 ARC

ARC时,有没有更多的将释放当前对象的内存strong指针谁试图保持活着的对象。 如果你不把它们设为nilARC认为你还在使用他们,他们会在记忆的时候,就会造成严重的内存泄露。

更新#1

如果您对按钮的任何引用,这是做到这一点的最简单的方法,你不需要做设置为nil任何东西,因为他们的superviewretain他们,你应该只从他们的去除superview

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

如果你存储其指针其他任何地方(在NSArray为前)。你必须能够从他们删除指针为好。



文章来源: Arc: Setting references to nil, for multiple buttons