首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objc_msgSend()错误消息,为什么?

objc_msgSend()错误消息,为什么?
EN

Stack Overflow用户
提问于 2010-09-28 13:47:23
回答 3查看 1.7K关注 0票数 2

我在我的应用程序中得到了"objc_msgSend()“的致命错误消息,多亏了仓鼠商场,我才能弄清楚到底发生了什么。

现在我找到了“问题”和“解决方案”,但我不明白为什么我的问题真的是个问题。

下面是一个场景:

Object_A -> Object_B --> Object_C

‘--’‘符号表示“创建”动作.Object_C类如下所示:

代码语言:javascript
复制
@interface Class_C {
  NSArray *items;
}
@property (nonatomic, retain) NSArray *tems;
@end

属性'items‘是通过’Object_B‘方法在setItems中设置的:

代码语言:javascript
复制
- (void)setItems:(NSArray *)items_ {
 if (object_B) {
  [object_B.taskItems release];
  object_B.taskItems = items_;
 }
 [super setItems:items_];
}

现在,如果我使用这种方法,我得到了亵渎的'objc_msgSend()‘错误,但是如果我评论发布线,一切都进行得很好。

注意:发布行中的retainCount为0,但发行版执行时没有问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-28 13:58:26

您将得到该错误,因为taskItems成员变量将被释放两次。不需要手动发布taskItems,因为使用点语法会自动处理它。

这一行:

代码语言:javascript
复制
object_B.taskItems = items;

调用taskItems的属性访问器,其中旧值在保留新值之前自动释放(或根据属性定义复制)。

Cocoa内存管理的一个非常好的一般规则是,只有在创建对象(通过alloc/init或release复制)的情况下,您才应该创建对象。发布object_B.taskItems将违反这一规则。

票数 2
EN

Stack Overflow用户

发布于 2010-09-28 13:58:41

嗯,哇。好的。

代码语言:javascript
复制
object_B.taskItems = items_;

和打电话一样

代码语言:javascript
复制
[object_B setTastItems: items_];

如果taskItems是要保留的属性,则不需要首先释放它,因为该属性会这样做。按照您现在的代码方式,它会被释放两次。

请记住,属性与目标C中的成员不一样。属性是访问类的私有成员的方法(并执行诸如retain/release@synchronized之类的高级操作)。

票数 1
EN

Stack Overflow用户

发布于 2014-01-31 16:06:15

我也遇到了类似的问题,但在我的例子中,情况是这样的:

在NSOperation属性"isFinished“运行时,当NSOperation运行时,当NSOperation完成并试图通知时,我创建了一个控制器来注册以侦听NSOperation属性中的更改:

代码语言:javascript
复制
[self willChangeValueForKey:@"isFinished"];

我得到了

代码语言:javascript
复制
objc_msgSend() corrupt cache error

但这是因为我的控制器超出了范围,为了修复它,我等待NSOperation KVO的结果,然后转移到下一个控制器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3813394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档