具有@property nonatomic和retain的变量是否应该显式释放。
@interface MyScreenViewController : UIViewController <UIWebViewDelegate> {
UIWebView* greetingView;
}
@property(nonatomic, retain) IBOutlet UIWebView* greetingView;
- (void)dealloc {
[greetingView release];
}
在delloc方法中发布是否必需???
答案 0 :(得分:5)
Ofcourse。是的,你应该发布你的属性与保留,复制,而不是分配。您在viewDidUnload中将属性设置为Nil。
- (void)viewDidUnload {
[super viewDidUnload];
self.greetingView = nil;
}
- (void)dealloc {
[greetingView release],greetingView = nil;
[super dealloc];
}
在UIViewController类引用中引用内存管理:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html
内存是iOS中的关键资源,视图控制器提供内置支持,可在关键时刻减少内存占用。 UIViewController类通过didReceiveMemoryWarning方法提供一些自动处理低内存条件的方法,该方法释放不需要的内存。在iOS 3.0之前,此方法是释放与自定义视图控制器类关联的额外内存的唯一方法,但在iOS 3.0及更高版本中,viewDidUnload方法可能更适合大多数需求。
当发生内存不足警告时,UIViewController类会清除其视图,如果它知道它可以重新加载或稍后再次重新创建它们。如果发生这种情况,它还会调用viewDidUnload方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括使用nib文件加载的对象,viewDidLoad方法中创建的对象以及懒惰创建的对象。运行时并添加到视图层次结构中。通常,如果视图控制器包含出口(属性或包含IBOutlet关键字的原始变量),则应使用viewDidUnload方法放弃这些出口的所有权或您不再需要的任何其他视图相关数据。
答案 1 :(得分:2)
是的,你应该释放它,因为它是一个保留的属性。任何保留(或复制)的属性都应该由同一个类释放(如果已分配,则不需要释放)。
保留基本上就像一个班级说:“我将使用这个其他课程,所以要记住它。” dealloc
就是这样的类,它本身就会从内存中删除。因此,如果需要保留属性的类即将消失,那么该对象本身也应该被释放。
否则它只会坐在内存中,程序中没有别的东西需要它。如果这种事情不断发生,你将会失去记忆。
(另外,请确保在dealloc方法结束时调用[super dealloc]
。)