Утечка памяти с массивом - цель c - PullRequest
0 голосов
/ 03 сентября 2010

У меня возникли проблемы с попыткой удалить утечку памяти из моего кода.В приведенном ниже коде я получаю утечку памяти в строке "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 Ответ

2 голосов
/ 03 сентября 2010

Кажется, проблема в том, что вы выделяете массив, выполняя

NSArray* configurationArray = [[NSArray alloc] init];

и затем вы создаете новый массив, выполняя

configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain];

без освобождения первого созданного вами массива. Первая строка должна быть просто

NSArray* configurationArray = nil;

И вам не нужно сохранять, так как это локальная переменная, и вы не держите указатель на этот массив вне области действия этой функции.

Сбой, вероятно, происходит из-за того, что объект, вызывающий этот метод, вероятно, не сохраняет объект, возвращенный этим методом, который будет освобожден вместе с массивом, если ничего не сохранит его. Поэтому, когда вы пытаетесь получить доступ к этому объекту где-то еще в вашем коде, объект больше не существует. Если вызывающий объект должен сохранить этот возвращенный объект, вызывающий объект должен сохранить возвращенный объект.

...