2

我正在使用iphone 游戏教程ccTouchesEnded的第二部分,我对该方法的实现感到困惑。这是实现“射击”的地方:玩家(一门大炮)转向接触的方向,射弹被射击。我不清楚的部分是:_nextProjectile似乎在它仍然可以使用的时候被释放(通过它下面的代码 - _nextProjectile runAction)。您能否解释一下为什么此时释放该对象是安全的?

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

[_player runAction:

 [CCSequence actions:

  [CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],

  [CCCallBlock actionWithBlock:^{

     // OK to add now - rotation is finished!

     [self addChild:_nextProjectile];

     [_projectiles addObject:_nextProjectile];



     // Release

     [_nextProjectile release];

     _nextProjectile = nil;

 }],

  nil]];



// Move projectile to actual endpoint

[_nextProjectile runAction:

 [CCSequence actions:

  [CCMoveTo actionWithDuration:realMoveDuration position:realDest],

  [CCCallBlockN actionWithBlock:^(CCNode *node) {

     [_projectiles removeObject:node];

     [node removeFromParentAndCleanup:YES];

 }],

  nil]];



}
4

1 回答 1

1

之前在ccTouchesEnded:withEvent:中,您在此行增加了_nextProjectile的保留计数:

_nextProjectile = [[CCSprite spriteWithFile:@"projectile2.png"] retain];

因此,稍后您必须减少保留计数以防止内存泄漏。换句话说:您有责任释放此保留。这就是这条线的来源:

[_nextProjectile release];

为什么在那个时候释放它是安全的?您在问题中发布的代码段实际上都是一系列操作中的操作。

[_player runAction:[CCSequence actions:...]];

对对象执行操作会增加该对象的保留计数。这意味着动作对象本身创建并持有对_nextProjectile的另一个引用。动作序列是在实际执行动作之前创建的,因此动作对象已经拥有自己对_nextProjectile的引用。所以在其中一个动作中释放它实际上是安全的。他们等待释放_nextProjectile直到这些行通过:

[self addChild:_nextProjectile];
[_projectiles addObject:_nextProjectile];

在这些行之前发布可能(我没有看过除了ccTouchesEnded:withEvent:之外的任何其他代码)会导致 EXC_BAD_ACCESS 运行时错误。

以下是有关保留计数的更多信息:cocos2d 论坛

于 2013-06-22T17:22:22.063 回答