繁体   English   中英

弧:将多个按钮的引用设置为nil

[英]Arc: Setting references to nil, for multiple buttons

当在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,因为项目非常复杂且具有交互性。)

我应该先在任何地方声明物品吗? 我应该在任何地方将它们设置为零吗? (还是我应该保持双手交叉并向圣弧祈祷?)

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

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

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

否:没什么好担心的。

ARC改变了您管理内存的工作方式,但是并没有改变基本原理,即每个对象都应照顾好自己对其他对象的引用,而不用担心别人的引用。

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

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

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


更新资料

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

没有。 :)

使用ARC时, 您肯定会将all指针设置为 nil ,不再需要了

当没有更多的strong指针试图使该对象保持活动状态时, ARC将释放当前对象的内存。 如果您未将它们设置nilARC认为您仍在使用它们,并且它们将位于内存中,并且会导致严重的内存泄漏。

更新#1

如果您对按钮有任何参考,这是最简单的方法,则无需将其设置为nil ,因为它们的superviewretain它们,您只需从其superview删除即可。

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

如果要将指针存储在其他任何地方(例如,在NSArray中),则也必须从指针中删除指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM