iOS:dealloc&IBOutlet

问题描述:

是否有必要在- (void)dealloc方法内设置所有@property s为retain修饰符声明为IBOutletnil?如果我不这样做,会消耗/浪费记忆吗?iOS:dealloc&IBOutlet

假设自动引用计数被关闭。

+0

[是否需要在dealloc中设置outlet变量为零(即使在IOS 3.0之后)?](http://*.com/questions/5658535/is-it-required-to-set-outlets -varibles到零合的dealloc偶数后IOS-3-0) – 2012-02-10 06:54:07

你的问题似乎是“我如何处理dealloc中的retain属性?”那我们来看一个例子。

@property (retain, nonatomic) IBOutlet UIView *myView; 

当你的视图被加载myView由两个对象保留,您的视图层次结构(由内部addSubview:或类似的)和视图控制器(由属性setter方法的装置)。一个简单的日志就是确认这一点所需要的。将这段代码viewDidLoad将确认这一走势与2

NSLog(@"myLabel is retained: %i", myView.retainCount); 

输出有两种方法,你应该解决这个指针,无一不是由Xcode自动填充好。

第一个在viewDidUnload(通常只在内存不足的情况下调用)您想释放视图,并且由于这会导致悬挂指针,所以您还希望将指针设置为零。 Xcode通过简单的使用setter方法来实现这一点。

[self setMyView:nil]; 

第二位,最初询问的地方是dealloc。在dealloc中,同样需要释放属性,虽然在这种情况下(主线程只执行,根据问题中的IBOutlet),悬挂指针应该不成问题。这似乎由Xcode的dealloc自动实现加强了。

[myView release]; 

当然除了指针设置为nil,以释放不会损害可言。如果这不是仅主线程UIKit元素,甚至可能更好。但是如果你担心多线程,你可能只需要使用atomic

即使没有ARC,也没有必要nil您的IBOutlets-(void)dealloc。使用仪器进行测试表明,只要UIView被解除分配,连接到IBOutlets的接口元素的内存就会释放。但是,如果您的应用程序使用线程,它仍然可能是一个很好的做法,因为它允许其他线程轻松确定所讨论的对象是否仍然可用。