0

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

- (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]: 发送到释放实例的消息

我试图[result retainCount]在调用保留之前记录并打印“1”。我不明白为什么调用保留时会引发错误。

谢谢,

一个

4

3 回答 3

0

initWithCapacity:不返回自动释放的对象。– 维瓦

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

于 2010-03-19T18:29:54.847 回答
0

尝试这个:

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

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

于 2010-03-19T17:05:50.397 回答
0

我认为上面的代码在技术上没有任何问题——otherMethod应该返回一个 autoreleased NSMutableArray。您确定在调用保留时遇到错误吗?看起来你可能会在某个时候不小心发送释放而不是保留。

从风格上讲,有一件事——标题中带有“new”的方法应该总是返回自动释放的对象,所以你应该将你的方法命名为其他名称(例如orderedArray...)或使用[[NSMutableArray alloc] initWithArray:]而不是arrayWithArray. 此外,方法签名不应该以大写字母开头(所以ByKey应该是byKey.

于 2010-03-19T17:06:28.980 回答