排序NSMutableArray内存泄漏

时间:2012-02-21 14:40:54

标签: objective-c memory-management memory-leaks nsmutablearray nssortdescriptor

我的对象有一个私有的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 个答案:

答案 0 :(得分:2)

你正在泄漏新阵列,而不是旧阵列:

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

基本规则是你必须释放你已经分配的任何东西,而你通常不应该关心为任何人保留东西(即[self setItems:]),那些需要保留东西的人会自己做。< / p>

我还建议将self.items变为可变数组,并使用[self.items sortUsingDescriptors:sortDescriptor进行排序,而不创建副本。

答案 1 :(得分: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];