iOS:dealloc&IBOutlet
是否有必要在- (void)dealloc
方法内设置所有@property
s为retain
修饰符声明为IBOutlet
至nil
?如果我不这样做,会消耗/浪费记忆吗?iOS:dealloc&IBOutlet
假设自动引用计数被关闭。
你的问题似乎是“我如何处理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
的接口元素的内存就会释放。但是,如果您的应用程序使用线程,它仍然可能是一个很好的做法,因为它允许其他线程轻松确定所讨论的对象是否仍然可用。
[是否需要在dealloc中设置outlet变量为零(即使在IOS 3.0之后)?](http://stackoverflow.com/questions/5658535/is-it-required-to-set-outlets -varibles到零合的dealloc偶数后IOS-3-0) – 2012-02-10 06:54:07