返回对象上的内存泄漏

时间:2009-11-24 19:17:20

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

编辑:

我刚刚添加了这个以确定它是否可以解决任何问题,但我仍在泄漏:

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

4 个答案:

答案 0 :(得分:5)

对于每次initretain来电,您应致电release(或autorelease)。

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

return [options autorelease];

这样,如果调用者想要保留它,他们可以,但如果他们只是使用结果并丢弃对象,他们就不必做任何事情,它将由{{3}发布}。

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

您应该阅读autorelease pool的部分内容,以便更好地了解如何管理此类泄漏。

答案 1 :(得分:0)

根据你在这里所拥有的内容,如果没有别的,你应该预期fileArray泄漏,因为你分配它但从未将它放在自动释放池中或释放它。尝试将其放入自动释放池中,看看是否有帮助。

答案 2 :(得分:0)

看着它,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返回什么,我期待这段代码中有一个自动释放的对象。

答案 3 :(得分:0)