CCParticleSystemQuad过早删除 - ios

时间:2013-07-13 09:41:45

标签: ios cocos2d-iphone ccparticlesystem

我有一个使用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

之前删除了

1 个答案:

答案 0 :(得分:-1)

看起来你有僵尸感染。

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

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

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

  

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

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

您可以使用NSZombieEnabled进行调试。使用NSZombieEnabled对象时,不应立即取消分配,而是转换为NSZombie对象。任何调用NSZombie方法的尝试都会在控制台中给你一条消息:“消息发送到解除分配的实例”。