【问题标题】:[CFArray release]: message sent to deallocated instance[CFArray release]: 发送到释放实例的消息
【发布时间】:2011-01-29 13:22:44
【问题描述】:

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

- (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时会抛出错误。

谢谢,

一个

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 你是对的!问题不在于保留消息,而在于分配 self.array = result 因为在以前的某个地方我使用 array = result 分配(不使用 self)
    【解决方案2】:

    试试这个:

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

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

    【讨论】:

    • initWithCapacity: 不返回自动释放的对象。
    【解决方案3】:

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

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

    【讨论】:

    • 你在想arrayWithCapacityinitWithCapacity 是一个初始化器,只能用作 [[NSMutableArray alloc] initWithCapacity:] 的一部分,否则你会崩溃(我认为)--alloc 返回一个非自动释放的对象,因此保留计数为 1。
    • 男人是正确的。你们两个(“希望对知识有用”,肯定是人)应该阅读内存管理规则:developer.apple.com/mac/library/documentation/General/…
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2012-03-23
    相关资源
    最近更新 更多