2010-09-28 80 views
2

我在我的应用程序中收到了“objc_msgSend()”杀手级错误消息,并感谢Hamster Emporium 我可以弄清楚发生了什么。objc_msgSend()错误消息,为什么?

现在我发现了“问题”和“解决方案”,但是我不明白为什么我的问题确实是一个问题。

下面是这种情况:

Object_A - > Object_B - > Object_C

的 ' - >' 符号表示 “创造” 的行动。 类Object_C的是这样的:

@interface Class_C { 
    NSArray *items; 
} 
@property (nonatomic, retain) NSArray *tems; 
@end 

属性“项目”通过“setItems”的方法设置Object_B:现在

- (void)setItems:(NSArray *)items_ { 
if (object_B) { 
    [object_B.taskItems release]; 
    object_B.taskItems = items_; 
} 
[super setItems:items_]; 
} 

,如果我用这个方法,是我得到了亵渎'objc_msgSend()'错误,但如果我评论释放线一切顺利。

注:在释放行retainCount为0,但释放执行没有问题

回答

2

你得到的是错误,因为taskItems成员变量被释放两次。没有必要手动发布taskItems,因为使用点语法自动处理它。

这条线:

object_B.taskItems = items; 

调用用于taskItems属性访问,其中,所述新的一个被保持之前的旧值会自动释放(或复制,这取决于属性的定义)。

Cocoa内存管理的一个非常好的通用规则是,如果你创建了一个对象(通过alloc/init或者copy),那么你应该只有release。释放object_B.taskItems将违反该规则。

1

严,哇。好。

object_B.taskItems = items_; 

是与调用

[object_B setTastItems: items_]; 

如果taskItems是设置保留,你不必先将它因为属性会这么做的属性。你现在拥有你的代码的方式,它会被释放两次。

请记住,属性与Objective-C中的成员不同。属性是访问班级的私人成员的方法(并且做类似retain/release@synchronized的花式东西)。

0

我也有类似的问题,但对我来说这是情景:

我做了一个控制器,将自己注册为监听在“isFinished”一个的NSOperation属性的变化,而的NSOperation正在我的控制器去离开,这时的NSOperation完成,并试图通知:

[self willChangeValueForKey:@"isFinished"]; 

objc_msgSend() corrupt cache error 

但它是因为我的控制器是出上海合作组织PE,解决它我等待NSOperation KVO的结果,然后移动到下一个控制器。