2014-01-13 93 views
2

對於在cocos2d-X中使用對象的保留和釋放是否有任何一般指導?在函數中創建對象時,函數返回的第二個函數內存是否被清除是真的。當一個對象被創建時,調用該對象的retain函數將會保留超出函數返回的對象嗎?對對象使用保留和釋放

++你有這樣的行爲,親切的問候

回答

16

一般在C:

void foo() { 
    Object a; 
    Object *pA = new Object(); 
    (…) 
} 

這將導致a處於功能結束自動銷燬,因爲它是在堆棧中分配。 *pA不會被破壞,因爲它被分配在堆上(因此,你只能放棄對它的引用,但對象本身仍然存在)。

Cocos實現了一種名爲「自動引用計數」的事情:每個CCObject都有一個引用計數器和兩個方法retain()release()。這種方式的工作原理是,每次創建對象時,它都會在cocos結構中註冊(CCPoolManager)。然後對每一幀(繪製它們之間)都有一個維護循環,檢查所有對象的引用計數器:如果是0這意味着(對於cocos)沒有其他對象引用它,因此刪除它是安全的。當您將此對象用作addChild函數的參數時,對象的保留計數會自動遞增。

例子:

void cocosFoo() { 
    CCSprite *a = CCSprite::create(…); 
    CCSprite *b = CCSprite::create(…); 

    this->addChild(b); 
} 

這裏發生的是這樣的:創建

  1. 兩個CCSprites,茯苓知道它們。
  2. b精靈被添加到this對象(比如一個CCLayer)
  3. 函數結束時,沒有對象被銷燬(兩者正對堆)。
  4. 在這個幀和下一幀之間的某個地方,保養就會運行。科科斯將這兩個精靈都分開,並看到a的引用計數== 0,因此它將其刪除。

這個系統相當不錯,因爲您不需要擔心內存管理。如果你想創建一個CCSprite(例如),但是不能把它作爲孩子添加,你可以調用retain(),這會提高其引用計數器,從而避免自動刪除。但是,你必須記得關於它的調用release()(例如,當它添加爲孩子時)。

你必須remeber有關的東西一般是:

  1. 由你retain()每次調用需要與release()配對。
  2. 您通常不應該自己刪除CCObjects。如果你覺得你需要有一個conveniece宏:CC_SAFE_DELETE(object)

因此,要回答你的問題在短期:

  1. 是否有使用保留和釋放對對象的任何一般性指導線cocos2d-X?

    是,你通常應該不需要做。

  2. 當創建函數中的對象,這是真的,所述功能存儲器被清除所述第二函數返回。

    答案,這是上面的全部文本。

  3. 當創建一個對象,調用該保留對象的功能,將保留對象超出了函數的返回?

    是的,因爲會增加它作爲一個孩子到另一個(保留以任何方式)的對象。

+1

我在這個問題上看到了最清晰的解釋(第一次閱讀維護循環!)。謝謝。 – AGPX

+1

感謝您的理解。完美,簡潔並且重要 –

+1

這就是我所說的一個很好的答案!感謝名單。 –

1

這裏是東西,

cocos2dx有autorelease池排水渠具有retain count=0這是一個變量,以保持在檢查cocos2dx對象範圍的對象。

現在,當您使用create方法創建新對象時,它已經添加到autorelease池中,並且您不需要釋放它或將它刪除到任何地方,它在java中的類似垃圾回收器會處理您背後的垃圾對象背部。

但是當你使用創建新對象「新」你一定要release在其析構函數或者其使用後結束。

第二件事,

當你的對象添加到autorelease游泳池,但你需要它在其他地方你可以只保留它,這增加了一個保留計數,然後你必須手動release它使用後結束了。

第三件事,

無論何時添加子你的對象會自動保留,但你並不需要將其釋放,而從父將其刪除。