objective-c - 返回对象上的内存泄漏

标签 objective-c iphone memory memory-management memory-leaks

我很难理解代码中的内存泄漏。基本上它返回一个包含对象的对象。这是以下代码:

-(id) getOptions {
    FileManager *file = [[FileManager alloc] initWithFileName:@"optionsFile.dat"];
    Options *options = [[Options alloc] init];
    NSMutableArray *fileArray = [[NSMutableArray alloc] init];
    fileArray = [file loadFile: @"optionsFile"];

    if ([fileArray count] > 0) {
        options = [fileArray objectAtIndex:0];
    }
    [file release];
    return options;
}

我尝试保留返回的对象并在使用后立即释放:

id options = [[self getOptions] retain];
[options release];

基本上,从 iPhone 文档来看,我应该在我的 filearray 的 mutatbe 数组上自动释放它,但我仍然遇到内存泄漏,任何人都可以对此进行一些说明,将不胜感激。

编辑:

我刚刚添加这个是为了看看它是否能解决任何问题,但我仍然泄漏:

FileManager *file = [[FileManager alloc] initWithFileName:@"optionsFile.dat"];
NSMutableArray *fileArray = [file loadFile: @"optionsFile"];
Options *options = [fileArray objectAtIndex:0];
[file release];
return options; 

最佳答案

对于每个 initretain 调用,您应该调用 release (或 autorelease)。

Options 对象缺少 release 调用。您应该要么不保留 getOptions 返回的对象,要么返回自动释放的实例。约定通常是返回一个自动释放的对象,为此,只需将 return 语句更改为:

return [options autorelease];

这样,如果调用者想要保留它,他们可以,但如果他们只是使用结果并丢弃该对象,他们不必做任何事情,它会被 autorelease pool 释放。 .

此外,fileArray 尚未发布。完成后,调用 [fileArray release];

您可能应该阅读 Memory Management Guide 的部分内容更好地了解如何管理此类泄漏。

关于objective-c - 返回对象上的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792304/

相关文章:

iphone - 当我使用 resumeSchedulerAndActions 时 Sprite 跳来跳去

c - cpu怎么知道内存中的数据是数据还是命令呢? (C 编程)

memory - 进程和Golang中的Goroutine一样吗?

iphone - ADBannerContentSizePortrait 在 iOS 5 上不可用

c++ - 释放分配给二维 vector 的内存

ios设置cornerRadius与尾随空格,圆角半径不起作用

iphone - UIBackgroundModes位置和显着位置变化随区域监控

ios - 如何以百分比计算角色扮演游戏等级进度

ios - 为什么这个 UIButton 图像不会显示在自定义 UITableViewCell 中?

iphone - 单击导航栏中的 "Back"按钮时阻止动画?