【问题标题】:Releasing object in viewDidUnload?在 viewDidUnload 中释放对象?
【发布时间】:2011-11-18 11:41:01
【问题描述】:
在我的应用程序中,我调用 presentModelViewController 来呈现一个新控制器。每次触发此操作时都会分配内存。但不知何故,它没有正确发布,因为在某些时候我的应用程序使用了太多内存并且它崩溃了。
这可能是因为我没有正确(或根本没有)释放属性对象是下面提到的正确方法吗? dealloc 可能是,但是 viewDidUnload 呢?
- (void)viewDidUnload {
[_sushiTypes release];
_sushiTypes = nil;
}
- (void)dealloc {
[_sushiTypes release];
_sushiTypes = nil;
[super dealloc];
}
【问题讨论】:
标签:
objective-c
ios
ios4
memory-management
【解决方案1】:
不要忘记 viewDidUnload 中对 super 的调用。您还应该通过其设置器访问您的实例变量,以在 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 中,转到 Product > Profile,然后在 Instruments 打开时选择 Allocations 模板。然后多次打开和关闭您的模态视图控制器,并检查您的泄漏和分配。如果每次您出席/解雇时分配都在增长,请尝试在每次出席/解雇之前和之后单击“标记堆”按钮。然后,您可以检查每个循环中正在分配和未释放的对象。
【解决方案2】:
我想我找到了问题所在。你不应该在 dealloc 函数中分配 nil 值。释放时通常的做法是将 viewDidUnload 与 setter 分配 nil 值,然后在 dealloc 方法中正确释放属性。像这样:
- (void)viewDidUnload {
self._sushiTypes = nil;
[super viewDidUnload];
}
- (void)dealloc {
[_sushiTypes release];
[super dealloc];
}
记得像 Matty 说的那样在 viewDidUnload 中调用 super。您可以参考这个 SO question 以获得有关此过程的更多信息。 First set to nil and then release.