这段代码运行良好但有些东西我不明白。
//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]];
答案 0 :(得分:0)
当执行CCCallBlockN时(旋转动作之后),它将被释放并设置为nil。
然而,当执行这段代码时,它还没有被释放,所以[_nextProjectile runAction ...]有效,因为你仍然有一个对它的引用_第一个序列还没有开始。
您必须释放它的原因是因为它保留在第一位,因此保留计数在某个时刻降至0。当发生这种情况时,由于CCSprite构造函数返回一个自动释放对象,当obj-c运行时清除自动释放池时,最后的清除和回收内存将在主循环的下一次迭代中发生。