0

这段代码运行良好,但有些东西我不明白。

做过

 //Release
 [_nextProjectile release];
 _nextProjectile =nil;

在 _player 的动作之后释放并设置 _nextProjectile 为 nil?如果是这样,如果 _nextProjectile 被释放,下一个块是如何工作的?

_nextProjectile = [[CCSprite spriteWithFile:@"projectile2.png"] retain];
_nextProjectile.position = ccp(20, winSize.height/2);
...
[_player runAction:
 [CCSequence actions:
  [CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],
  [CCCallBlockN actionWithBlock:^(CCNode *node) {
     [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

0

当 CCCallBlockN 被执行时(在旋转动作之后),它将被释放并设置为 nil。

然而,当这段代码被执行时,它还没有被释放,所以 [_nextProjectile runAction ...] 可以工作,因为你仍然有一个对它的引用——第一个序列甚至还没有开始。

您必须释放它的原因是因为它首先被保留,因此保留计数在某个时候下降到 0。发生这种情况时,由于 CCSprite 构造函数返回一个自动释放对象,因此最终的清除和回收内存将在主循环的下一次迭代中进行,此时自动释放池被 obj-c 运行时清理。

于 2013-04-03T12:39:24.650 回答