Iphone:在哪里发布对象?

时间:2011-01-11 15:19:12

标签: iphone memory-management

我应该释放对象:在方法dealloc或viewDidUnload?

由于

4 个答案:

答案 0 :(得分:2)

您的简短回答问题:dealloc()

对于你的问题,答案是一个冗长而复杂的答案:

  1. 在viewDidUnload()中释放所有未使用的IBOutlets。当您的设备内存不足时,将调用此方法。
  2. 释放当前视图控制器负责内存管理的任何对象,并在dealloc()中释放它们。 (自动释放的对象不属于此类别)

答案 1 :(得分:2)

正确的方法是释放它们并在这两种方法中将它们设置为nil。

  1. 您需要在viewDidUnload中释放您的对象,因为内存警告可能会发生,如果您的视图没有超视图,那么您应该释放您的插座以节省内存。如果视图已卸载,框架将再次发出viewDidLoad。
  2. 您需要在dealloc中释放对象,因为不一定要调用viewDidLoad + viewDidUnload。
  3. 最后,您需要在两种方法中将变量设置为nil,以便第二次无法调用它们的释放。

答案 2 :(得分:1)

loadView和/或viewDidLoad中分配和/或保留的任何对象都应在viewDidUnload中发布。释放您在viewDidLoad中分配的任何内容都很容易理解,如果您使用NIB,loadView会更难。任何定义为IBOutlet的属性的retain都将隐式保留为loadView的一部分。

如果视图具有例如UITextField的子视图,并且您将此视图连接到定义为的属性:

 @property(nonatomic, retain) IBOutlet UITextField* nameField;

然后,从NIB加载时的实际文本字段的保留计数为+2。 +1因为它的父视图而+1,因为你连接它的属性也是如此。因此,在释放视图控制器或再次加载NIB之前,不会释放内存。

不幸的是,在取消分配视图控制器时,不会调用viewDidUnload。所以你必须在这里明确地释放你所有的`IBOutlets。我使用这种模式是为了不忘记发布任何东西:

-(void)releaseOutlets {
  // Set all outlets to nil
}

-(void)viewDidUnload {
    [self releaseOutlets];
    [super viewDidUnload];
}

-(void)dealloc {
    [self releaseOutlets];
    // Release anything else.
    [super dealloc];
}

答案 3 :(得分:0)

以这种方式释放,如果父对象被释放,子对象也将被释放。