我在我的代码中使用以下方法:
- (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
答案 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应该释放它。注意详细说明?