2009-11-24 188 views
2

我很难在代码中掌握这种内存泄漏。基本上它返回一个包含对象的对象。这里的下面的代码:返回对象上的内存泄漏

-(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; 
+0

你并不需要分配并初始化每个变量。当你这样做时,每个赋值给该变量都会覆盖你新分配的对象。 – dreamlax 2009-11-24 19:34:31

回答

5

对于每个initretain通话,你应该叫release(或autorelease) 。

Options对象缺少release调用。您也应该保留从getOptions返回的对象,或者返回一个自动发布的实例。该公约通常返回一个自动释放的对象,要做到这一点,只是改变了return语句:

return [options autorelease]; 

这样,如果主叫方希望把它保留下来就可以了,但如果他们只是使用的结果并丢弃该对象,他们不必做任何事情,它将由autorelease pool发布。

此外,fileArray未发布。一旦你完成了,请致电[fileArray release];

您应该仔细阅读Memory Management Guide的部分内容,以更好地了解如何管理这种泄漏。

+0

当我添加一个[fileArray发布]它打破了我的应用程序,我想知道它是否与当我这样做: options = [fileArray objectAtIndex:0]; – Frank 2009-11-24 19:35:42

+1

你甚至不应该在做一个alloc + init,只是把'[file loadFile:@“optionsFile”]'的结果赋给变量。 – 2009-11-24 19:42:06

0

根据你在这里的内容,如果没有别的,你应该预计fileArray泄漏,因为你分配它,但从来没有把它放在autorelease池或释放它。尝试把它放在autorelease池中,看看是否有帮助。

0

看着它,选项和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返回,我在此代码期待一个自动释放的对象。

+2

如果'[fileArray count]> 0','options'仍然会泄漏。 – dreamlax 2009-11-24 19:33:13

+0

fileArray返回一个自动释放对象 – Frank 2009-11-24 20:02:27

+0

dreamlax是正确的,还有一个选项泄漏。 – Elfred 2009-11-24 20:46:13