【问题标题】:iPhone memory leak and release problem on sorted arrayiPhone内存泄漏和排序数组上的释放问题
【发布时间】:2010-02-26 09:27:56
【问题描述】:

我在使用下面的代码时遇到了一些问题:

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];

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

【问题讨论】:

  • 您的第二个代码块正在分配一个 NSMutableArray,您必须向它发送一条释放消息,否则它会泄漏。阅读这篇文章,看看它是否能解决一些困惑 (cocoadev.com/index.pl?AutoRelease)
  • 正如我所说,如果我发送发布消息,我会收到 EXC_BAD_ACCESS。我在一个辅助函数中使用此代码,该函数在任何地方都被调用以使用特定键对数组进行排序。
  • 所以,如果我使用这个函数: - (NSMutableArray *) orderArray:(NSMutableArray *)array ByKey:(NSString *)key ascending:(BOOL)ascending { NSSortDescriptor *idDescriptor = [[[NSSortDescriptor alloc] initWithKey:key 升序:ascending] autorelease]; NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor]; NSArray *orderArray = [数组 sortedArrayUsingDescriptors:sortDescriptors]; NSMutableArray *result = [[[NSMutableArray alloc] initWithArray:orderArray] autorelease];返回结果;当在任何其他代码中收到对象时,我是否必须保留它?

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


【解决方案1】:

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

- (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多