Objective C中的Malloc错误

Bet*_*ker 1 cocoa objective-c retain

现在在我的应用程序中有一个生产者输出一组数据; 该生产者的输出被绑定(使用XIB文件中的"Bindings")到我的窗口中的表视图.制作人吐出数据,它出现在窗口中,一切都很好.

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

我创建的对象如下所示:

@interface testFilter: NSObject {
id output;
}
-(void)setInput:(id)s;
@end
Run Code Online (Sandbox Code Playgroud)

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

[myFilter bind:@"input" toObject:producer withKeyPath:@"output" options:0];
Run Code Online (Sandbox Code Playgroud)

我的实现看起来像这样:

-(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
}
Run Code Online (Sandbox Code Playgroud)

但这与错误一起崩溃:

"malloc:***对象0x108e00870错误:未释放指针被释放"

......直到我删除该[copiedArray release]行.

我以为我应该寄来错了[copiedArray release]吗?

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

Dru*_*erB 9

id copiedArray = [NSMutableArray arrayWithCapacity:3];
Run Code Online (Sandbox Code Playgroud)

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

删除您的发布呼叫,或将该行更改为:

id copiedArray = [[NSMutableArray alloc] initWithCapacity:3];
Run Code Online (Sandbox Code Playgroud)

话虽这么说,考虑使用自动参考计数(ARC).


高级内存管理编程指南:

您拥有自己创建的任何对象

创建使用名称以一个方法的对象alloc, new,copy,或mutableCopy(例如,alloc,newObject,或 mutableCopy).

您可以使用retain获取对象的所有权

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

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

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

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

这只是以前的政策规则的必然结果