IOS:使用@property (nonatomic, retain)发布变量

4

@property(nonatomic, retain)修饰的变量是否需要显式释放?

@interface MyScreenViewController : UIViewController <UIWebViewDelegate> {
    UIWebView* greetingView;
}

@property(nonatomic, retain) IBOutlet UIWebView* greetingView;

- (void)dealloc {
  [greetingView release];
}

在 dealloc 方法中是否需要释放?

1
在继续编码之前,您必须阅读以下内容:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html - trojanfoe
2个回答

5
当然。是的,你应该使用retain和copy来发布你的属性,而不是使用assign。在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方法放弃对这些插座或任何其他与视图相关的数据的所有权,您不再需要它们。


viewDidUnload 方法中,设置了 self.greetingView = nil;,然后调用了 delloc 并执行了释放操作。但是变量值为 nil,这样符合预期吗? - nswamy
如果在值为nil的类上调用消息,则它不会执行任何操作并返回nil。因此,如果 greetingView 为nil,则 [greetingView release] 不会执行任何操作。这并不是问题。 - Matthew Gillingham
@nanjunda 这是正确的做法。请参考内存管理指南。将属性设置为 nil 会释放它并将其设置为 nil。 - ARC
3
当你调用self.greetView = nil时,实际上这个类已经被释放了。因为你使用了"self."来调用它,它将运行合成的setGreetView:方法,该方法会自动发送release方法。所以当它到达-(void)dealloc方法时,这个对象已经被释放了,当[greetView release]被调用时,什么也不会发生。然而,你需要保持Nikita所描述的代码完全相同,因为viewDidLoad可能在dealloc之前就不会被调用,你的代码可能会跟另一种路径走。因此,你必须在dealloc中也进行释放。 - Matthew Gillingham
@MatthewGillingham 你能否请释放对象而不是类。 - ARC
显示剩余3条评论

2

是的,你应该释放它,因为它是一个被保留的属性。任何被保留(或复制)的属性都应该由同一个类释放(如果它被分配了,就不需要释放)。

保留基本上就像一个类在说,“我将要使用这个其他的类,所以保持它在内存中。”dealloc是说出这句话的类本身将要从内存中移除的地方。因此,如果需要你保留的属性的类即将消失,那么这个对象本身也应该被解除分配。

否则,它只会在内存中闲置,当程序中没有其他东西需要它时。如果这种情况一直发生,你将会耗尽内存。

(还要确保在dealloc方法的末尾调用[super dealloc]。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接