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

現在の項目はプロパティです: @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]; 
関連する問題