Cocos2d iphone 操作内存管理:何时释放?

Cocos2d iphone 操作内存管理:何时释放?,cocos2d-iphone,Cocos2d Iphone,当你向一个精灵添加一个动作时,因为Cocos中的大多数东西都是自动释放的,它是否会在完成后被释放?或者,因为您将其添加到节点,它是否由节点保留 如果该操作因自己完成或您自己停止而结束,那么该操作是否随后被释放,或者是否仍可以稍后运行 我问这个问题是因为我想知道您是否需要重新创建操作来重用它们,或者您是否可以简单地引用它们的标记,并随时随意启动和停止它们。如果它们重复,如果你可以简单地通过标签号获得它们,然后再次运行它们;目前还不清楚“正确”的方法。感谢您的帮助。当您将引用与运行操作消息一起传递给

当你向一个精灵添加一个动作时,因为Cocos中的大多数东西都是自动释放的,它是否会在完成后被释放?或者,因为您将其添加到节点,它是否由节点保留

如果该操作因自己完成或您自己停止而结束,那么该操作是否随后被释放,或者是否仍可以稍后运行


我问这个问题是因为我想知道您是否需要重新创建操作来重用它们,或者您是否可以简单地引用它们的标记,并随时随意启动和停止它们。如果它们重复,如果你可以简单地通过标签号获得它们,然后再次运行它们;目前还不清楚“正确”的方法。感谢您的帮助。

当您将引用与运行操作消息一起传递给CCNode时,它会将其传递给CCActionManager,后者会将操作发送到保留消息。一旦操作完成,它将发送一条释放消息。如果您想继续使用某个操作,您应该保留对该操作的引用,并发送您自己的保留和释放消息


这些动作被设计成轻量级的“开火并忘记”对象。除非您注意到性能问题并将其追溯到性能问题,否则我不会对此担心。

我的理解是,当您在精灵上创建并运行操作时,该操作将添加到
CCActionManager
,它是一个为您管理操作的单例。这包括在
CCACtionManager
本身被释放时以及在操作完成时释放所有这些操作

这是关于后者的相关代码(来自CCActionManager.m):

-(无效)更新:(ccTime)dt
{
对于(tHashElement*elt=targets;elt!=NULL;){
...
如果(!currentTarget->暂停){
//在该循环内,“操作”ccArray可能会更改。
对于(currentTarget->actionIndex=0;currentTarget->actionIndexactions->num;currentTarget->actionIndex++){
....
如果(currentTarget->currentActionSalvaged){
....
[currentTarget->currentAction release];
}else if([currentTarget->currentAction isDone]){
.... 
CCAction*a=currentTarget->currentAction;
currentTarget->currentAction=nil;
[自我反思:a];
}
.....
}
}

在做了一些之后,重用和操作的主题似乎站不住脚。无论如何,您可以在这里阅读。IMO,我不会尝试重用操作…

操作是一次性类。一旦操作“完成”或停止,或者运行操作的节点被释放,操作将(自动)释放

如果您需要重复使用操作,那么只有一个非常可怕的解决方案:您需要再次向现有操作发送相应的init…消息。您还必须手动保留该操作


Actions是非常轻量级的类,它们的运行时性能相当于分配一个新的NSObject实例。我个人认为,如果您因为创建和发布了许多Actions而遇到性能问题,我会说您使用Actions太多了,应该寻找更好的解决方案。

想要重新配置的动机是什么euse actions?我对暂停和重新启动动画很感兴趣。因为动画是在CCRepeatForever动作中,我想我可以通过它的标记停止动作,然后再重新启动它,但是如果我创建一个指向它的实例变量,给它
retain
,那么我可以随时启动和停止它,而无需重新创建每次都吃动画,对吗?看起来更好的方法是这里的答案,它建议您只需将动作创建和运行放在更新方法中,然后简单地计划该方法并取消计划,使其运行一次,然后在您希望“重用”某个动作的任何时候对其进行计划:
-(void) update: (ccTime) dt
{
for(tHashElement *elt = targets; elt != NULL; ) {   
    ...
    if( ! currentTarget->paused ) {

        // The 'actions' ccArray may change while inside this loop.
        for( currentTarget->actionIndex = 0; currentTarget->actionIndex < currentTarget->actions->num; currentTarget->actionIndex++) {
                           ....

            if( currentTarget->currentActionSalvaged ) {
                              ....
                [currentTarget->currentAction release];

            } else if( [currentTarget->currentAction isDone] ) {
                                  .... 
                CCAction *a = currentTarget->currentAction;
                currentTarget->currentAction = nil;
                [self removeAction:a];
            }
                .....
        }
    }