【问题标题】:Memory leak on return object返回对象上的内存泄漏
【发布时间】:2010-12-20 00:32:38
【问题描述】:

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

-(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 文档中,我应该在我的 mutatbe 数组上自动释放它以用于 filearray,但我仍然遇到内存泄漏,任何人都可以对此有所了解,将不胜感激。

编辑:

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

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

【问题讨论】:

  • 您不需要分配和初始化每个变量。当您这样做时,对该变量的每个分配都会覆盖您新分配的对象。

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


【解决方案1】:

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

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

return [options autorelease];

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

另外,fileArray 未发布。完成后,请致电[fileArray release]

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

【讨论】:

  • 当我添加一个 [fileArray release] 时它会破坏我的应用程序,我想知道它是否与我这样做时有关:options = [fileArray objectAtIndex:0];
  • 你甚至不应该执行 alloc + init,只需将 [file loadFile: @"optionsFile"] 的结果分配给变量。
【解决方案2】:

看着它,Options 和 fileArray 正在泄漏。代码应如下所示:

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

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

我不确定 loadFile 返回什么,我希望这段代码中有一个自动释放的对象。

【讨论】:

  • options 如果[fileArray count] > 0 仍然会泄漏。
  • fileArray 返回一个自动释放的对象
【解决方案3】:

根据你在这里的情况,如果没有别的,你应该期望fileArray 泄漏,因为你分配了它,但永远不要将它放入自动释放池或释放它。尝试将其放入自动释放池中,看看是否有帮助。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2012-10-31
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多