0

У моего объекта есть частные элементы NSMutableArray. Я использую следующий код для сортировки объектов элементов в порядке размера:Устранить утечку памяти 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, я allocing новой памяти и назначение чтобы указать на него. Я пытался выпускать старую память следующим образом:

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

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

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

+0

Показать реализацию/объявление метода 'setItems'. Это * должно * сохранить # newArray, то есть вам нужно '[newArray release]' сразу же после его вызова. – trojanfoe

+0

на данный момент items is property: @property (неатомный, назначить) NSMutableArray * items; Думаю, мне нужно прочитать, когда использовать «сохранить» в флагах свойств! – JimmyB

ответ

2

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

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

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

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

+0

отлично! Огромное спасибо. если флаги свойств элементов должны быть сохранены, а не назначать? – JimmyB

+0

@JimmyB Я предположил, что они уже есть. Да, для этого варианта использования они должны быть. Если ваш объект является владельцем массива, он сохраняет массив. – hamstergene

+0

похоже, что он должен работать, но по какой-то причине добавление этого [newArray release] приводит к сбою приложения даже до того, как оно попадет в эту функцию ... очень странно! – JimmyB

0

Есть ли причина, по которой вы не можете освободить 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]; 
Смежные вопросы