在尝试从我的代码中删除内存泄漏时遇到了一些麻烦。在下面的代码中,我在“configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain]”行中遇到内存泄漏;“但是当我删除保留时,应用程序崩溃并将保留更改为自动释放也会导致崩溃。
感谢, 威廉
-(NSArray*)decodeConfigurationFile:(NSString*)fileName{
NSArray* configurationArray = [[NSArray alloc] init];
NSString *controllerConfigurationFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];
if (controllerConfigurationFilePath != nil) {
// returns array of items storing the data for form
configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain];
}
// returns fields dictionary objects from plist into an array
return [[configurationArray objectAtIndex:0] objectForKey:@"fields"];
}
答案 0 :(得分:2)
问题似乎是您通过执行
分配数组NSArray* configurationArray = [[NSArray alloc] init];
然后你通过
创建一个新数组configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain];
没有释放你创建的第一个数组。第一行应该只是
NSArray* configurationArray = nil;
并且您不应该需要retain,因为它是一个局部变量,并且您没有在该函数范围之外保留指向该数组的指针。
崩溃可能是因为调用此方法的对象可能没有保留此方法返回的对象,如果没有其他任何东西保留它,它将与数组一起释放。因此,当您尝试在代码中的其他位置访问该对象时,该对象不再存在。 如果调用对象需要保留此返回的对象,则调用对象应保留返回的对象。