對於在cocos2d-X中使用對象的保留和釋放是否有任何一般指導?在函數中創建對象時,函數返回的第二個函數內存是否被清除是真的。當一個對象被創建時,調用該對象的retain函數將會保留超出函數返回的對象嗎?對對象使用保留和釋放
++你有這樣的行爲,親切的問候
對於在cocos2d-X中使用對象的保留和釋放是否有任何一般指導?在函數中創建對象時,函數返回的第二個函數內存是否被清除是真的。當一個對象被創建時,調用該對象的retain函數將會保留超出函數返回的對象嗎?對對象使用保留和釋放
++你有這樣的行爲,親切的問候
一般在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);
}
這裏發生的是這樣的:創建
b
精靈被添加到this
對象(比如一個CCLayer)a
的引用計數== 0,因此它將其刪除。這個系統相當不錯,因爲您不需要擔心內存管理。如果你想創建一個CCSprite(例如),但是不能把它作爲孩子添加,你可以調用retain()
,這會提高其引用計數器,從而避免自動刪除。但是,你必須記得關於它的調用release()
(例如,當它添加爲孩子時)。
你必須remeber有關的東西一般是:
retain()
每次調用需要與release()
配對。CC_SAFE_DELETE(object)
因此,要回答你的問題在短期:
是否有使用保留和釋放對對象的任何一般性指導線cocos2d-X?
是,你通常應該不需要做。
當創建函數中的對象,這是真的,所述功能存儲器被清除所述第二函數返回。
答案,這是上面的全部文本。
當創建一個對象,調用該保留對象的功能,將保留對象超出了函數的返回?
是的,因爲會增加它作爲一個孩子到另一個(保留以任何方式)的對象。
這裏是東西,
cocos2dx有autorelease
池排水渠具有retain count=0
這是一個變量,以保持在檢查cocos2dx
對象範圍的對象。
現在,當您使用create方法創建新對象時,它已經添加到autorelease池中,並且您不需要釋放它或將它刪除到任何地方,它在java中的類似垃圾回收器會處理您背後的垃圾對象背部。
但是當你使用創建新對象「新」你一定要release
在其析構函數或者其使用後結束。
第二件事,
當你的對象添加到autorelease
游泳池,但你需要它在其他地方你可以只保留它,這增加了一個保留計數,然後你必須手動release
它使用後結束了。
第三件事,
無論何時添加子你的對象會自動保留,但你並不需要將其釋放,而從父將其刪除。
我在這個問題上看到了最清晰的解釋(第一次閱讀維護循環!)。謝謝。 – AGPX
感謝您的理解。完美,簡潔並且重要 –
這就是我所說的一個很好的答案!感謝名單。 –