这是一个假设的 setter/getter :
- (DetailViewController *)detailController
{
if (detailController == nil) {
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"Detail" bundle:nil];
self.detailController = controller;
[controller release];
}
return detailController;
}
然后调用它的代码看起来像这样:
- (void)loadControllerOrSomething
{
DetailViewcontroller *controller = self.detailController;
[navigationController doSomethingWith:controller];
}
我关于内存管理的问题如下。如果我让 *controller 超出范围,在 loadControllerOrSomething 中,我是否会泄漏内存?使用navigationController后我应该做一个controller = nil吗?
最佳答案
不,你不会泄露任何东西。
在返回之前没有向 Controller 添加额外的保留,并且在接收时也没有添加保留。如果您需要保证它存在于您的函数范围之外,您应该对其调用保留,并在完成后释放。
这就是 Cocoa 中内存管理的一般工作方式。当函数返回对象时,您没有所有权。除非您调用“保留”,否则它将在其自然生命周期结束时被删除,这可能是下一帧、下一分钟等。
异常(exception)情况是名称包含“alloc”或“copy”且返回新对象的函数。当不再需要它们时,您有责任调用release。
关于iPhone关于内存管理的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/586885/