Упорядочивание и освобождение NSArray в Objective-C

#objective-c #memory-leaks #nsarray #release

#objective-c #утечки памяти #nsarray #освободить

Вопрос:

Я пытаюсь отсортировать массив стран. Этот способ работает, но я не могу понять, как освободить tmpArray. Как мне освободить его и есть ли лучший способ сделать это?

 // PUT COUNTRIES IN ARRAY
NSString *myFile = [[NSBundle mainBundle] pathForResource:@"Countries" ofType:@"plist"];
NSArray *tmpArray = [[NSArray alloc] initWithContentsOfFile:myFile]; 
tmpArray = [tmpArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];  
arrayCountries = [[NSArray alloc] initWithArray:tmpArray] ;
   //   [tmpArray release];
  

Ответ №1:

Либо -autorelease тот, который вы выделяете / инициализируете (потому что вы теряете ссылку на него, когда заменяете его отсортированным массивом), либо используйте другую переменную типа ‘ sortedTmpArray ‘.

В данный момент вы делаете «создайте этот объект и назначьте его tmpArray «, затем «создайте другой массив, отфильтровав этот и назначив его tmpArray «. На этом этапе у вас больше нет указателя на первый созданный вами массив, поэтому освободить его невозможно — произошла утечка.

Решение состоит в том, чтобы поместить его в пул авторелиза при его создании или просто использовать два отдельных указателя. В качестве альтернативы, вы можете создать изменяемый массив в первый раз и использовать -sortUsingDescriptors: для сортировки его на месте вместо создания двух отдельных массивов.

Комментарии:

1. Спасибо! Я ввел NSArray *tmpArray = [[[NSArray alloc] initWithContentsOfFile:myFile] авторелиз]; и теперь я не получаю никаких предупреждений в анализаторе. Спасибо Джошуа.

2. Конечно. Является ли «arrayCountries» переменной экземпляра? Если это так, вы могли бы сократить его, присвоив результат сортировки arrayCountires напрямую: arrayCountries = [[tmpArray sortedArrayUsingSelector:@selector (caseInsensitiveCompare:)] сохранить]; … сохранение необходимо, потому что -sortedArrayUsingSelector: возвращает автоматически выпущенный массив.

3. Прохладный. Сначала я попробовал этот способ, но без сохранения. При этом он отлично работает и выглядит лучше. Еще раз спасибо!