在我的应用中,我调用presentModelViewController来呈现一个新的控制器。每次触发此操作时都会分配内存。但不知怎的,它没有正确发布,因为在某些时候我的应用程序使用了太多的内存并且它崩溃了。
可能这是因为我没有正确地释放属性对象(或者根本没有)下面提到了正确的方法吗? dealloc可能是,但是viewDidUnload呢?
- (void)viewDidUnload {
[_sushiTypes release];
_sushiTypes = nil;
}
- (void)dealloc {
[_sushiTypes release];
_sushiTypes = nil;
[super dealloc];
}
答案 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.