返回对象上的内存泄漏
我很难在代码中掌握这种内存泄漏。基本上它返回一个包含对象的对象。这里的下面的代码:返回对象上的内存泄漏
-(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;
对于每个init
或retain
通话,你应该叫release
(或autorelease
) 。
Options
对象缺少release
调用。您也应该保留从getOptions
返回的对象,或者返回一个自动发布的实例。该公约通常返回一个自动释放的对象,要做到这一点,只是改变了return语句:
return [options autorelease];
这样,如果主叫方希望把它保留下来就可以了,但如果他们只是使用的结果并丢弃该对象,他们不必做任何事情,它将由autorelease pool发布。
此外,fileArray
未发布。一旦你完成了,请致电[fileArray release]
;
您应该仔细阅读Memory Management Guide的部分内容,以更好地了解如何管理这种泄漏。
当我添加一个[fileArray发布]它打破了我的应用程序,我想知道它是否与当我这样做: options = [fileArray objectAtIndex:0]; – Frank 2009-11-24 19:35:42
你甚至不应该在做一个alloc + init,只是把'[file loadFile:@“optionsFile”]'的结果赋给变量。 – 2009-11-24 19:42:06
根据你在这里的内容,如果没有别的,你应该预计fileArray
泄漏,因为你分配它,但从来没有把它放在autorelease池或释放它。尝试把它放在autorelease池中,看看是否有帮助。
看着它,选项和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返回,我在此代码期待一个自动释放的对象。
你并不需要分配并初始化每个变量。当你这样做时,每个赋值给该变量都会覆盖你新分配的对象。 – dreamlax 2009-11-24 19:34:31