[CFArray release]:发送给deallocated实例的消息

时间:2010-03-19 16:45:16

标签: iphone objective-c cocoa memory-management dealloc

我在我的代码中使用以下方法:

- (NSMutableArray *) newOrderedArray:(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];

    [idDescriptor release];

    NSMutableArray *result = [NSMutableArray arrayWithArray:orderArray];

    return result;
}

这是一种编码良好的便捷方法吗?我认为,它会返回一个自动释放的NSMutableArray。

此方法由另一个方法调用:

- (id) otherMethod {

    NSMutableArray *otherResult = [[[NSMutableArray alloc] initWithCapacity:[otherArray count]] autorelease];

   // I add some stuff to otherResult and then...

    NSMutableArray *result = [dbUtils newOrderedArray:otherResult ByKey:@"objectId" ascending:NO];
    return result;
}

在某些视图控制器中调用此方法(otherMethod),我想存储返回的数组,并在释放视图控制器时释放它。但是,当在此视图控制器中调用[result retain]时(因为我需要它可用并且我不能允许它被释放)我收到以下错误:

  

[CFArray release]:发送到解除分配的实例的消息

我在调用retain之前尝试记录[result retainCount]并打印“1”。我不明白为什么在调用retain时会抛出错误。

谢谢,

A

3 个答案:

答案 0 :(得分:0)

试试这个:

    NSMutableArray *otherResult = [[NSMutableArray initWithCapacity:[otherArray count]];

因为initWithCapacity将返回一个自动释放的数组。现在你告诉Autoreleasepool释放数组两次。

答案 1 :(得分:0)

我在上面的代码中看不到任何技术上的错误 - otherMethod应该返回自动释放的NSMutableArray。你确定在调用retain时遇到错误吗?看起来你可能会偶然发送释放而不是保留。

在风格上,有一件事 - 标题中带有“new”的方法应该始终返回 - 自动释放的对象,因此您应该为其他方法命名(例如orderedArray... )或使用[[NSMutableArray alloc] initWithArray:]代替arrayWithArray。此外,方法签名不应以大写字母开头(因此ByKey应为byKey

答案 2 :(得分:0)

  

initWithCapacity:不返回自动释放的对象。 - Wevah

AFAIK initWithCapacity是一个便利初始化器,按照惯例返回自动释放的对象。因此,如果对象仅在本地方法中使用,则autoreleasepool应该释放它。注意详细说明?