我在我的应用程序中得到了"objc_msgSend()“的致命错误消息,多亏了仓鼠商场,我才能弄清楚到底发生了什么。
现在我找到了“问题”和“解决方案”,但我不明白为什么我的问题真的是个问题。
下面是一个场景:
Object_A -> Object_B --> Object_C
‘--’‘符号表示“创建”动作.Object_C类如下所示:
@interface Class_C {
NSArray *items;
}
@property (nonatomic, retain) NSArray *tems;
@end属性'items‘是通过’Object_B‘方法在setItems中设置的:
- (void)setItems:(NSArray *)items_ {
if (object_B) {
[object_B.taskItems release];
object_B.taskItems = items_;
}
[super setItems:items_];
}现在,如果我使用这种方法,我得到了亵渎的'objc_msgSend()‘错误,但是如果我评论发布线,一切都进行得很好。
注意:发布行中的retainCount为0,但发行版执行时没有问题。
发布于 2010-09-28 13:58:26
您将得到该错误,因为taskItems成员变量将被释放两次。不需要手动发布taskItems,因为使用点语法会自动处理它。
这一行:
object_B.taskItems = items;调用taskItems的属性访问器,其中旧值在保留新值之前自动释放(或根据属性定义复制)。
Cocoa内存管理的一个非常好的一般规则是,只有在创建对象(通过alloc/init或release复制)的情况下,您才应该创建对象。发布object_B.taskItems将违反这一规则。
发布于 2010-09-28 13:58:41
嗯,哇。好的。
object_B.taskItems = items_;和打电话一样
[object_B setTastItems: items_];如果taskItems是要保留的属性,则不需要首先释放它,因为该属性会这样做。按照您现在的代码方式,它会被释放两次。
请记住,属性与目标C中的成员不一样。属性是访问类的私有成员的方法(并执行诸如retain/release和@synchronized之类的高级操作)。
发布于 2014-01-31 16:06:15
我也遇到了类似的问题,但在我的例子中,情况是这样的:
在NSOperation属性"isFinished“运行时,当NSOperation运行时,当NSOperation完成并试图通知时,我创建了一个控制器来注册以侦听NSOperation属性中的更改:
[self willChangeValueForKey:@"isFinished"];我得到了
objc_msgSend() corrupt cache error但这是因为我的控制器超出了范围,为了修复它,我等待NSOperation KVO的结果,然后转移到下一个控制器。
https://stackoverflow.com/questions/3813394
复制相似问题