是否有必要在@property
方法中将所有retain
IBOutlet
修饰符设置为nil
到- (void)dealloc
?如果我不这样做会消耗/浪费内存吗?
假设自动参考计数已关闭。
答案 0 :(得分:1)
即使没有ARC,也无需nil
IBOutlets
-(void)dealloc
IBOutlets
。使用Instruments进行测试表明,只要UIView
被释放,就会释放连接到{{1}}的界面元素的内存。
但是,如果你的应用程序使用线程,那么这样做仍然是一个好习惯,因为它允许其他线程轻松确定相关对象是否仍然可用。
答案 1 :(得分:0)
您的问题似乎是“如何处理dealloc中的retain
属性?”好吧,让我们来看一个例子。
@property (retain, nonatomic) IBOutlet UIView *myView;
加载视图时,myView
由两个对象保留,即视图层次结构(通过内部addSubview:
或类似物)和视图控制器(通过属性设置器方法)。只需一个简单的日志即可确认这一点。将此代码放在viewDidLoad
中将以2的输出确认。
NSLog(@"myLabel is retained: %i", myView.retainCount);
有两种方法可以解决此指针,并且Xcode
会自动为您填写这两种方法。
首先在viewDidUnload
中(通常只在低内存情况下调用)你想要释放视图,因为这会导致悬空指针,你也想将指针设置为nil。 Xcode通过简单地使用setter方法实现了这一目标。
[self setMyView:nil];
第二个地方,以及您最初询问的地方是dealloc
。在dealloc中你同样需要释放你的属性,虽然在这种情况下(主线程只执行,基于问题中的IBOutlet
)悬挂指针应该不是问题。这似乎通过Xcode自动实现dealloc得到了加强。
[myView release];
当然,除了释放之外,将指针设置为nil
根本不会有害。如果这不是主线程UIKit
元素,甚至可能更好。但如果您担心多线程,则可能只需使用atomic
。