3

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

我的问题是:

没有什么方法可以在我调用stopSystem之前删除无限持续时间的 CCParticleSystemQuad,并将autoRemoveOnFinished设置为YES

以下是一些附加信息:

我初始化发射器如下:

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 行上崩溃(因为发射器已经释放)。我收到了一些反馈,表明它有时会在发射器活动期间设备被锁定/解锁时发生,但对我来说它可以工作并且这些崩溃很少见。我无法重现它发生的情况,所以我再次问你们:

没有什么方法可以在我调用stopSystem之前删除无限持续时间的 CCParticleSystemQuad,并将autoRemoveOnFinished设置为YES

4

1 回答 1

-1

看起来你有僵尸感染。

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

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

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

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

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

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

于 2013-07-13T11:30:19.917 回答