iOS:dealloc& IBOutlet中

时间:2012-02-10 06:44:42

标签: ios memory-management

是否有必要在@property方法中将所有retain IBOutlet修饰符设置为nil- (void)dealloc?如果我不这样做会消耗/浪费内存吗?

假设自动参考计数已关闭。

2 个答案:

答案 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