在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祈祷?)
一些指导意见将不胜感激。感谢。
答案 0 :(得分:5)
您的视图控制器是否具有指向这60个项目中的每一个的属性或实例变量?
是:然后在-viewDidUnload
中将这些ivars或属性设置为nil。
否:然后没什么值得担心的。
ARC更改你要做的事情来管理内存,但它并没有改变基本原则,即每个对象都应该处理自己对其他对象的引用,但不要担心别人的
在这种情况下,包含所有这些项的视图将具有对项的强引用(通过它的子视图数组)。当视图控制器释放其视图时,该视图将被释放并在该过程中释放其所有子视图。因此所有这些项目都将得到妥善处理。如果您确实对这些项中的任何项都有强引用,那么这些引用将阻止引用的对象被释放 - 将引用设置为nil将避免这种情况。
答案 1 :(得分:1)
如果您即时创建这些视图并将其添加为scrollView的子视图,则无需执行任何其他操作。
在-viewDidUnload
期间发布scrollView时,它会正确清理其所有子视图。
<强>更新强>
这样想。在故事板上的常规视图设置中,您不需要为每个视图都拥有属性,只需要控制器与之交互的视图。这基本上是一回事。您有一堆嵌入到superview中的视图。如果控制器没有与它们交互,那么您不必担心它们。
答案 2 :(得分:0)
没有。 :)
当你使用nil
时,你肯定会将所有指针设置为 ARC
不再需要的。
当没有更多ARC
指针尝试保持对象的活动时,strong
将释放当前对象的内存。如果你没有将它们设置为nil
ARC
认为你仍在使用它们,它们将在内存中,它们将导致严重的内存泄漏。
更新#1
如果你有任何关于按钮的参考,这是最简单的方法,你不需要设置nil
任何东西,因为他们的superview
类retain
他们你应该从他们的superview
中删除。
for (UIView *_subView in self.view.subviews) {
if ([_subView isKindOfClass:[UIButton class]]) {
[_subView removeFromSuperview];
}
}
如果你将指针存放在任何其他位置(例如NSArray
中),你必须从它们中删除指针。