在cocos2d中发布

时间:2013-04-03 09:22:18

标签: ios objective-c cocos2d-iphone

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

 //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]];

1 个答案:

答案 0 :(得分:0)

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

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

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