2011-12-01 56 views
1

將動作添加到精靈時,由於Cocos中的大部分內容都是自動釋放的,它在完成後會被釋放嗎?或者,因爲您將其添加到節點,它是否由節點保留?操作內存管理:它們何時被釋放?

如果行動結束了,無論是由於自己完成還是因爲您自己停止行動,它會被釋放還是仍然可以稍後運行?

我問,因爲我想知道你是否需要重新創建動作來重用它們,或者如果你可以簡單地引用它們的標籤並隨時隨意啓動和停止它們。如果他們重複,如果你可以簡單地通過標籤號得到它們,然後再運行它們;目前還不清楚這種「正確」方式。感謝幫助。

+0

想要重用操作的動機是什麼? – drewish

回答

1

我的理解是,當你在一個精靈上創建和運行一個動作時,這個動作被添加到CCActionManager,這是一個單身人員,可以爲你管理動作。這包括在發佈CCACtionManager本身時以及動作完成時釋放它們。

這大約是後者(從CCActionManager.m)的相關代碼:

-(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]; 
      } 
       ..... 
     } 
    } 

做一些research後,似乎再利用和行動的主題是搖搖欲墜的理由。無論如何,你可以在這裏讀到什麼cocos2d best practices suggest。國際海事組織,我不會嘗試和重用行動...

+0

看起來像一個更好的方法是這裏的一個答案,這表明你只是把你的動作創建和運行在更新方法中,然後簡單地調度該方法並對其進行調度,以便它運行一次,然後隨時調度它,以便「重用」一個動作:http://www.cocos2d-iphone.org/forum/topic/2701#post-16778 – johnbakers

1

當您通過runAction消息將引用傳遞給CCNode時,它會將其交給CCActionManager,CCActionManager將發送操作的保留消息。一旦行動完成,它會發送一條釋放消息。如果你想繼續使用一個動作,你應該保留對它的引用併發送你自己的保留和釋放消息。

這些動作被設計成輕量級的「消防和忘記」對象。除非你注意到性能問題並追溯到他們,否則我不會擔心。

1

行動是一次性類。一旦動作「完成」或已經停止或運行該動作的節點被釋放,動作將被釋放(自動)。

如果您需要重新使用操作,那麼只有一個相當可怕的解決方案可用:您需要將相應的init ...消息再次發送到現有操作。您還必須手動保留該操作。

操作是非常輕量級的類,它們的運行時性能與分配新的NSObject實例相當。就我個人而言,我認爲如果您因爲創建和發佈許多操作而遇到性能問題,我會說您使用的操作太多,應該尋找更好的解決方案。

+0

我有興趣暫停和重新開始動畫。因爲動畫是在CCRepeatForever動作中,所以我認爲我可以通過其標記停止動作,然後重新啓動它,但是如果我創建一個指向它的實例變量,則將其保留,然後我可以啓動它並且每當我想要停止它,而不是每次重新創建動畫,對吧? – johnbakers