1

我正在使用 Cocos2d(ARC)。我正在制作一个使用自定义 CCSprite 类的游戏

+(id)createMySprite
{
   return [[self alloc] initMy] ;
}

这是我的 CCSprite 类。我在哪里分配内存。由于 ARC,我无法编写 autorelease。我有两个 CCLayer 类。在头等舱中,只需单击该按钮即可播放按钮,它会替换屏幕并移动第二个屏幕。在第二类中,我获取了许多自定义 CCSprite 类。当我更换到第一类 CCLayer 时,它永远不会释放第二类的内存,内存会不断增加。然后在达到 20-30 MB 实时内存后崩溃。所以我需要这方面的帮助。

分配

基本上,标头是 ARC 兼容的。源代码不支持 ARC。因此,您在不启用 ARC 的情况下将 Cocos2D 编译为静态库,然后在代码中链接到它,您可以安全地将 ARC 用于您的类和 Cocos2D 元素的自定义子类。如果我错了,请纠正我,但是在你的项目中使用 ARC 应该没有问题,并且说一个使用 ARC 并且不手动放置保留和释放消息的 CCSprite 子类。正确的?

4

1 回答 1

0

我知道这已经存在了很长一段时间,并且很可能您已经解决了它,但是对于那些正在阅读并仍在寻找答案的人,这是我对 CCNodes 和保留周期的理解。

基本上我已经写过关于这个的博客,并且我有一个设计模式可以绕过保留的 CCNodes。链接在这里。http://www.rotategears.com/development/ccnode-arc-memory-management/

简而言之,如果您创建一个节点 ivar 并且不指定引用的强度,它将获得一个强引用。然后,当您将它作为子节点添加到也将维护引用的节点时,您将创建一个双重保留,当操作系统尝试释放它时会导致问题。ivar 必须是周,以便您在此容器中的保留计数仅为 1。话虽如此,然后您必须小心如何将此弱引用分配给 ivar,因为在分配它之前它需要一个引用计数 1,否则 ivar 将被设置为 nil。

于 2014-06-25T05:31:58.247 回答