【问题标题】:cocos2d scene dealloccocos2d 场景释放
【发布时间】:2012-05-26 00:38:06
【问题描述】:

我有一个带有 CCMenu 的 Cocos2d 场景 (CCLayer)。我将 dealloc 实现为

- (void) dealloc {
    [menu release];
    menu = nil;

    [super dealloc];
}

当我使用共享导演将场景替换为另一个场景时,它会加载第二个场景,然后在 dealloc 中程序崩溃,尤其是在

[super dealloc]; //Thread1: Program received signal: "EXC_BAD_ACCESS".

替换场景的调用是

[[CCDirector sharedDirector] replaceScene:
     [CCTransitionFade transitionWithDuration:0.5f scene:[SomeOtherScene scene]]];

为什么会这样?我应该调用 [super dealloc] 吗?

【问题讨论】:

标签: iphone ios cocos2d-iphone


【解决方案1】:

如果你用[CCMenu menuWithItems:...]创建了menu,你不需要在dealloc中释放它,因为它没有被保留。

【讨论】:

    【解决方案2】:

    我认为您需要将菜单设置为 nil 然后释放它,这可能是您的问题。要回答您的第二个问题,是的,您绝对应该调用 [super dealloc] ,否则可能会导致更多问题。

    【讨论】:

    • 对不起,我在看raywenderlich.com/2657/…,他确实释放了 THEN nil 所以我相信你的正确。抱歉,我最近在我所有的项目中都使用了 ARC。但是请调用 [super dealloc];
    • 设置为 nil 然后释放不释放任何东西,为什么?因为您正在向 nil 发送发布消息,它什么也不做。可能的问题是@pbaris 从未保留或复制菜单,因此他释放了一个没有所有权的对象。
    • 这个答案可能会导致泄漏,如果您丢失了对分配对象的唯一引用,您将永远无法正确释放它。
    • 正确的方法是什么?我的界面是 Scene : CCLayer { CCMenu *menu; }
    • 取决于您如何创建 CCMenu,cocos2d 旨在将内存管理保持在最低限度,并且通常所有内容都是自动释放的。但是,如果您实际上分配了它,则必须释放它,但是您可以在将其作为子项添加后执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多