【问题标题】:CCParticleSystemQuad removed prematurely - iosCCParticleSystemQuad 过早删除 - ios
【发布时间】:2013-07-13 09:41:44
【问题描述】:

我有一个使用 cocos2d v1.1.0-beta2b 的 ios 应用程序,遇到了发射器自动移除的非常奇怪的情况。

我的问题是:

是否有任何方法可以使 无限持续时间 CCParticleSystemQuad(将 autoRemoveOnFinished 设置为 YES)在我调用 stopSystem 之前删除?

这里有一些附加信息:

我将发射器初始化如下:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
emitter = [[[CCParticleSystemQuad alloc]
                                    initWithDictionary:dict] autorelease];
emitter.duration = -1.0f;
[emitter setAutoRemoveOnFinish:YES];
[self addChild:emitter z:10];

然后,它当然是作为孩子添加的,并且一切正常。 正如许多地方所建议的那样,为了将其删除,我调用:

[emitter stopSystem]; 

之后,当所有粒子都消失后,发射器会按预期移除。

到目前为止一切都很好。

但是,我遇到了几个崩溃报告,表明发射器过早释放,然后我的应用程序在 stopSystem 行上崩溃(因为发射器已经释放)。 我收到了一些反馈,表明在发射器活动期间设备被锁定/解锁时有时会发生这种情况,但对我来说它可以工作并且这些崩溃很少见。 我无法重现它发生的情况,所以我再次问你们:

是否有任何方法可以使 无限持续时间 CCParticleSystemQuad(将 autoRemoveOnFinished 设置为 YES)在我调用 stopSystem 之前删除?

【问题讨论】:

  • 你用的是cocos2d v1.1.0-beta2b吗?这个版本对吗?
  • 这个问题只出现在新版本的cocos2d中……新版本中出现了一些小故障……

标签: ios cocos2d-iphone ccparticlesystem


【解决方案1】:

看起来你感染了僵尸。

Zombie 是由悬空指针引起的:它指向的对象已经被释放,但指针继续指向该位置。当您尝试调用该对象的任何方法时,您会遇到崩溃。

emitter = [[[CCParticleSystemQuad alloc]
                                initWithDictionary:dict] autorelease];

您的 emitter 指向自动释放的对象。看起来它“继续”存在,而自动释放池没有被耗尽;

它有时会在发射器活动期间设备被锁定/解锁时发生,

这听起来像锁定/解锁触发自动释放池耗尽,你的emitter 变成僵尸。

您可以使用NSZombieEnabled 对其进行调试。使用 NSZombieEnabled 对象不会在应该立即释放,而是变成 NSZombie 对象。任何调用 NSZombie 方法的尝试都会在控制台中给你一条消息:“message sent to deallocated instance”。

【讨论】:

  • 如果我错了,请纠正我,但是当我使用 addChild 在 cocos2d 中将发射器添加为子级时,该对象不应该被自动释放...我将编辑我的帖子以使其更清晰.
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多