Сортировка утечки памяти NSMutableArray - PullRequest
0 голосов
/ 21 февраля 2012

Мой объект имеет частные элементы NSMutableArray.Я использую следующий код для сортировки объектов в элементах в порядке размера:

-(void)sortItems{
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES];    
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [items sortedArrayUsingDescriptors:sortDescriptors];
NSMutableArray* newArray = [[NSMutableArray alloc] initWithArray: sortedArray];
[self setItems:newArray];
[sortDescriptor release];   

}

Очевидно, что это утечка памяти, потому что каждый раз, когда я вызываю sortItems, я выделяюновая память и назначение предметов для указания на нее.Я попытался освободить старую память следующим образом:

NSMutableArray* newArray = [[NSMutableArray alloc] initWithArray: sortedArray];
NSMutableArray* oldArray = [self items];
[self setItems:newArray];
[oldArray release];

Но это дает ошибку EXC_BAD_ACCESS.Я прочитал об обработке памяти в objC, и я убежден, что я делаю здесь что-то принципиально неправильное.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Вы пропускаете новый массив, а не старый:

NSMutableArray* newArray = [[NSMutableArray alloc] initWithArray: sortedArray];
[self setItems:newArray];
[sortDescriptor release];
[newArray release]; // <-- add this

Фундаментальное правило состоит в том, что вы должны освобождать все, что вы выделили, и вам обычно не нужно заботиться о сохранении вещей.для любого (то есть [self setItems:]) те, кому нужно что-то сохранить, сделают это сами.

Я бы также рекомендовал сделать self.items изменяемым массивом и использовать [self.items sortUsingDescriptors:sortDescriptor для сортировки на месте без создания копии.

0 голосов
/ 21 февраля 2012

Есть ли причина, по которой вы не можете выпустить newArray в своем первом примере?

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES];    
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [items sortedArrayUsingDescriptors:sortDescriptors];
NSMutableArray* newArray = [[NSMutableArray alloc] initWithArray: sortedArray];
[self setItems:newArray];
[newArray release];
[sortDescriptor release]; 
...