排序数组上的iPhone内存泄漏和释放问题

时间:2010-02-26 09:27:56

标签: iphone objective-c memory arrays memory-leaks

我遇到以下代码的麻烦:

NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor];
NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors];  
NSMutableArray *result = [NSMutableArray arrayWithArray:orderArray];

如果我使用此代码,Instruments会说我有内存泄漏,为什么?

使用此代码:

NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor];
NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors];

NSMutableArray *result = [[NSMutableArray alloc] initWithArray:orderArray];

我也收到泄漏警告,但是,如果我自动释放对象结果,则会发生内存错误。

1 个答案:

答案 0 :(得分:2)

我认为这是一个更好的答案。

- (NSMutableArray *) orderArray:(NSMutableArray *)array ByKey:(NSString *)key ascending:(BOOL)ascending 
{ 
    NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending]];
    NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; 
    NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors]; 
    NSMutableArray *result = [[[NSMutableArray alloc] initWithArray:orderArray]];

    [release idDescriptor]; 
    return [result autorelease]; 
}

所以,你分配idDescriptor,然后你使用它,最后释放它。由于您正在返回result,因此您可以使用返回值自动发布。我还有一个问题。您是否在代码中的其他位置引用了result