我最近刚刚将一个 cocos2d v1.x 项目迁移到 v2.x,一切似乎都很好。然后我打开了ARC。但是现在,CCLayer 的 dealloc 之一永远不会被调用。在转换过程中,该方法中的大部分内容都消失了,只留下一个 CCLog 来指示该层何时被释放。我不确定从 no-Arc 到 ARC 出了什么问题。各种消息来源都提到必须有其他东西保留它。这很奇怪,因为它释放了所有这些更改。我还没有详细了解我的代码(该层有很多代码)。但是只是想看看 cocos2d v2.x + ARC 是否有任何常见的陷阱。
问问题
155 次
1 回答
1
刚刚解决了这个问题。cclayer 保留在 ARC 案例中(在看似良好的转换之后)但之前没有保留的原因是我已经声明了实例变量
@interface SomeObject {
CCNode *_parent;
}
而且我没有为它定义@property。
我在实现的某个地方做了一个分配。在无 ARC 中似乎没问题,因为 _parent 上可能没有任何保留。但在 ARC 之后,似乎 _parent 现在是一个强有力的参考。它导致了父子样式的循环引用。我认为一个解决方法是使其成为 unsafe_unretained。但我没有打扰,因为这是一些我实际上忘记注释掉的旧代码。我摆脱了这个伊瓦尔。我认为在尝试第一次转换为 ARC 时,这可能是一个陷阱。这也意味着在没有 @property 的情况下声明 ivar 不是一个好习惯,并且在转换旧项目时可能会像这样咬人。
于 2013-04-29T16:20:42.220 回答