【问题标题】:Cocos2D 2.0 ARC enabled uncontrolled deallocsCocos2D 2.0 ARC 启用不受控制的释放
【发布时间】:2012-10-01 03:52:21
【问题描述】:

我最近将一个现有的 Cocos2D 项目从 0.8 版迁移到 2.0 版并启用了 ARC。

我这样做的方式是使用 Apple 的空应用程序模板,然后添加来自 Cocos2d 2.x 模板的代码,因为它有重大变化。之后,我添加了游戏中的代码并对已弃用的代码和 ARC 问题进行了必要的更改。

由于游戏正在运行,但不如预期,我没有动画并且游戏占用了整个 CPU 资源。从控制台我看到一切都在创建后立即被释放。我的旧代码不是原因,因为它甚至发生在我的任何场景被推送之前。

编辑 我还重复了整个过程并从 Cocos2D 模板项目中制作了一个支持 ARC 的版本,但那里也一样。这可能是正常的事情吗?

【问题讨论】:

    标签: objective-c memory-management cocos2d-iphone automatic-ref-counting dealloc


    【解决方案1】:

    虽然转换为 ARC 时常见问题,但这是不正常的。 ARC 将释放对象超出范围,而在 MRC 下,alloc/init 对象将保留在内存中(并泄漏)。检查您可能需要在哪里保留强有力的参考。

    这是一个在转换为 ARC 之前有效的示例:

    -(void) someMethod
    {
        id object = [[MyObject alloc] init];
    }
    

    在 MRC 下,对象在 someMethod 返回后保留在内存中(泄漏)。在 ARC 下,ARC 在方法返回时清理对象。最简单的解决方法是将对象转换为 ivar(也称为实例变量,类成员)。

    还要检查单例。根据其实现方式,Singleton 类可能会立即解除分配。例如,如果静态实例被声明为 __weak 或 __unsafe_unretained。

    您还应该运行 Xcode Analyzer(构建 -> 分析)以获取潜在问题的指针。

    【讨论】:

    • 或多或少是这样的。我希望它可以是框架内的东西,但是经过长时间的重构,现在一切都按预期运行了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2013-12-17
    相关资源
    最近更新 更多