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运行时错误
以下是有关保留计数的更多信息:我认为这是一个关于块的问题。