在viewDidUnload中释放对象?

时间:2011-09-16 07:42:05

标签: objective-c ios ios4 memory-management

在我的应用中,我调用presentModelViewController来呈现一个新的控制器。每次触发此操作时都会分配内存。但不知怎的,它没有正确发布,因为在某些时候我的应用程序使用了太多的内存并且它崩溃了。

可能这是因为我没有正确地释放属性对象(或者根本没有)下面提到了正确的方法吗? dealloc可能是,但是viewDidUnload呢?

- (void)viewDidUnload {
    [_sushiTypes release];
    _sushiTypes = nil;
}

- (void)dealloc {
    [_sushiTypes release];
    _sushiTypes = nil;
    [super dealloc];
}

2 个答案:

答案 0 :(得分:3)

不要忘记在viewDidUnload中调用super。您还应该通过其setter访问您的实例变量,以在viewDidUnload中将其设置为nil。在dealloc中,只需直接释放实例变量。

- (void)viewDidUnload {
[super viewDidUnload];
NSLog(@"viewDidUnload being called");
self.sushiTypes = nil;
}

- (void)dealloc {
[_sushiTypes release];
NSLog(@"dealloc being called");
[super dealloc];
}

我不认为这是你的记忆问题的根源。您的模态视图控制器是否具有任何其他实例变量或IBOutlets?

为了帮助进一步调试,请尝试使用Instruments。从Xcode,go Product>配置文件,然后在“仪器”打开时选择“分配”模板。然后多次打开和关闭模态视图控制器,并检查泄漏和分配。如果每次出席/解雇时分配都在增长,请尝试在每次出席/退出前后单击“标记堆”按钮。然后,您可以检查正在分配的对象,而不是在每个循环中取消分配。

答案 1 :(得分:1)

我想我发现了这个问题。你不应该在dealloc函数中指定nil值。释放时的通常做法是viewDidUnload使用setter分配nil值,然后在dealloc方法中正确释放属性。像这样:

- (void)viewDidUnload {
    self._sushiTypes = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    [_sushiTypes release];
    [super dealloc];
}

记得像Matty所说的那样在viewDidUnload中调用super。您可以参考此SO问题,以获得有关此过程的更多信息。 First set to nil and then release.