1

现在在我的应用程序中有一个输出数据数组的生产者;该生产者的输出被绑定(使用 XIB 文件中的“绑定”)到我窗口中的表视图。生产者吐出数据,显示在窗口中,一切正常。

除了我需要修改显示的数据。生产者是第三方应用,所以我不能直接修改它,所以我需要创建一个介于两者之间的过滤器对象。

我创建的对象如下所示:

@interface testFilter: NSObject {
id output;
}
-(void)setInput:(id)s;
@end

我更改了绑定,以便生产者的输出进入我的输入:

[myFilter bind:@"input" toObject:producer withKeyPath:@"output" options:0];

我的实现如下所示:

-(id)init
{
    self = [super init];
    output = nil;
    return self;
}

- (void)setInput:(id)newInput
{
    int nEntries = (int)[newInput count];
    id copiedArray = [NSMutableArray arrayWithCapacity:3];
    for (id entry in newInput)
    {
        id copiedEntry = [entry mutableCopy];
        // blah blah make some changes to copiedEntry
        [copiedArray addObject:copiedEntry];
        [copiedEntry release];   // I'm done with it, copiedArray added his own retain
    }
    [self setValue:copiedArray forKey:@"output"];

    [copiedArray release];   // I'm done with it, setValue/output added a retain
}

但这因错误而崩溃:

“malloc:对象 0x108e00870 的 *** 错误:未分配被释放的指针”

...直到我删除[copiedArray release]线。

我认为我应该发送是错误的[copiedArray release]吗?

我还能检查什么/推荐的调试此类问题的方法是什么?

4

1 回答 1

9
id copiedArray = [NSMutableArray arrayWithCapacity:3];

这将创建一个自动释放的对象。你不应该释放自动释放的对象。

删除您的发布调用,或将该行更改为:

id copiedArray = [[NSMutableArray alloc] initWithCapacity:3];

话虽如此,请考虑使用自动引用计数 (ARC)


来自高级内存管理编程指南

您拥有您创建的任何对象

使用名称以allocnewcopymutableCopy(例如 、allocnewObject) 开头的方法创建对象mutableCopy

您可以使用保留来获取对象的所有权

接收到的对象通常保证在接收它的方法中保持有效,并且该方法也可以安全地将对象返回给它的调用者。您retain在两种情况下使用:(1)在访问器方法或初始化方法的实现中,获取您要存储为属性值的对象的所有权;(2) 防止对象因某些其他操作的副作用而无效。

当您不再需要它时,您必须放弃您拥有的对象的所有权

您通过向对象发送release 消息或autorelease消息来放弃对象的所有权。因此,在 Cocoa 术语中,放弃对象的所有权通常称为“释放”对象。

您不得放弃您不拥有的对象的所有权

这只是先前政策规则的推论,表示

于 2013-05-15T19:53:58.933 回答