#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. Прохладный. Сначала я попробовал этот способ, но без сохранения. При этом он отлично работает и выглядит лучше. Еще раз спасибо!