Ios raywenderlich教程-简单iphone游戏-第2部分

Ios raywenderlich教程-简单iphone游戏-第2部分,ios,objective-c,cocos2d-iphone,Ios,Objective C,Cocos2d Iphone,我正在使用的是的第二部分,我对cctouchesend方法的实现感到困惑。这是实施“射击”的地方:玩家(一门加农炮)转向被触摸的方向,射弹被射击。 我不清楚的部分是:\u nextProjectile似乎是在它可能仍在使用时发布的(通过它下面的代码-\u nextProjectile runAction)。 你能解释一下为什么在这个时候释放物体是安全的吗 - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [

我正在使用的是的第二部分,我对
cctouchesend
方法的实现感到困惑。这是实施“射击”的地方:玩家(一门加农炮)转向被触摸的方向,射弹被射击。 我不清楚的部分是:
\u nextProjectile
似乎是在它可能仍在使用时发布的(通过它下面的代码-
\u 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]];



}
在前面的ccTouchesEnded:withEvent:you增加了这一行上的下一个项目的保留计数:

_nextProjectile = [[CCSprite spriteWithFile:@"projectile2.png"] retain];
因此,在以后的某个时候,您必须减少保留计数以防止内存泄漏。换言之:你有责任释放这个保留。这就是这条线的来源:

[_nextProjectile release];
为什么在那一点释放它是安全的?您在问题中发布的代码片段实际上都是一系列操作中的操作

[_player runAction:[CCSequence actions:...]];
对对象执行操作会增加该对象的保留计数。这意味着动作对象本身创建并保存另一个对\u nextproject的引用。动作序列是在实际执行动作之前创建的,因此动作对象已经有了自己对\u nextproject的引用。因此,在其中一个操作中释放它实际上是安全的。他们等待释放下一个项目,直到这些行通过:

[self addChild:_nextProjectile];
[_projectiles addObject:_nextProjectile];
这些行之前的版本可能会(除了ccTouchesEnded:withEvent:)导致EXC_BAD_ACCESS运行时错误


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

我认为这是一个关于块的问题。