内存泄漏与阵列 - 目标c

时间:2010-09-03 15:14:39

标签: iphone objective-c arrays memory-leaks retain

在尝试从我的代码中删除内存泄漏时遇到了一些麻烦。在下面的代码中,我在“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"];
}

1 个答案:

答案 0 :(得分:2)

问题似乎是您通过执行

分配数组
NSArray* configurationArray = [[NSArray alloc] init];

然后你通过

创建一个新数组
configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain];

没有释放你创建的第一个数组。第一行应该只是

NSArray* configurationArray = nil;

并且您不应该需要retain,因为它是一个局部变量,并且您没有在该函数范围之外保留指向该数组的指针。

崩溃可能是因为调用此方法的对象可能没有保留此方法返回的对象,如果没有其他任何东西保留它,它将与数组一起释放。因此,当您尝试在代码中的其他位置访问该对象时,该对象不再存在。 如果调用对象需要保留此返回的对象,则调用对象应保留返回的对象。