iPhone关于内存管理的问题

标签 iphone objective-c cocoa cocoa-touch

这是一个假设的 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/

相关文章:

iphone - 如何在ios5中将NSString转换为JSON格式?

iphone - 有人可以告诉我如何创建一个 CGPattern 来用图像描画路径吗?

ios - 如何使用 vk ios sdk 在 vk 上的墙上发布来自 ios 应用程序的链接

ios - 我们可以在不改变约束的情况下将 nib 中的类从 uiview 更改为 uiscrollview 吗?

cocoa - matchingFontDescriptorsWithMandatoryKeys 如何匹配字体描述符?

ios - 强制使用已使用 NSUserDefaults 创建的实体

iphone - 为 iPhone 和 iPad 构建应用程序

iphone - 地理位置 : Protocol on iPhone Safari

iphone - UIGraphicsGetImageFromCurrentImageContext 视网膜分辨率?

ios - 在 [NSRunLoop(NSRunLoop) runMode :beforeDate:] 中发生奇怪的崩溃