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]
吗?
我还能检查什么/调试这样的问题的推荐方法是什么?
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术语中,放弃对象的所有权通常被称为"释放"对象.您不得放弃您不拥有的对象的所有权
这只是以前的政策规则的必然结果
归档时间: |
|
查看次数: |
465 次 |
最近记录: |