1. 程式人生 > >初窺Cocos2d-x記憶體管理機制(1)

初窺Cocos2d-x記憶體管理機制(1)

Cocos2d-x版本:cocos2d-2.1rc0-x-2.1.3

windows下測試。

VS版本:VS2010.

.在Cocos2d記憶體管理中使用的引用計數機制,每個物件都包含一個用來控制生命週期的引用計數器,它就是CCObject的成員變數m_uReference。我們可以通過

retainCount()方法來獲得物件當前的引用計數數值。

詳細測試如下:

一、在物件使用creat方法後,物件的引用數值為1,它自動呼叫autorelease()方法,以CCSprite為例(程式碼如下):

CCSprite* CCSprite::create(const char *pszFileName)
{
    CCSprite *pobSprite = new CCSprite();
    if (pobSprite && pobSprite->initWithFile(pszFileName))
    {
        pobSprite->autorelease();
        return pobSprite;
    }
    CC_SAFE_DELETE(pobSprite);
    return NULL;
}

測試如下,新建一個HelloWorld工程,將起設定為專案啟動項。

(1)改動HelloWorldScene.h,程式碼如下:

USING_NS_CC;

class HelloWorld : public cocos2d::CCLayer
{
	
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();
    
    // a selector callback
    void menuCloseCallback(CCObject* pSender);

    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);

	CC_SYNTHESIZE(CCSprite*,m_Tsprite,Tsprite);
};


(2)HelloWorld的init()方法最後新增測試程式碼和改動按鈕回撥函式當中程式碼,測試程式碼如下:

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //////////////////////////////////////////////////////////////////////////
        // super init first
        //////////////////////////////////////////////////////////////////////////
		
        CC_BREAK_IF(! CCLayer::init());
		
		/*省略了很多程式碼*/
		
		CCSprite* fish = CCSprite::create();
		CCLOG("retainCount after create: %d",fish->retainCount());
		
		this->setTsprite(fish);
        bRet = true;
    } while (0);

    return bRet;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    //CCDirector::sharedDirector()->end();
	CCLOG("retainCount after autorelease: %d",m_Tsprite->retainCount());
}

啟動除錯後,輸出日誌如圖:


當點選按鈕後,輸出日誌如圖:


二、在new一個物件的時候,它的引用數值為一,也步呼叫其release()和atuorelease()方法,測試方法同上,測試程式碼:

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //////////////////////////////////////////////////////////////////////////
        // super init first
        //////////////////////////////////////////////////////////////////////////

        CC_BREAK_IF(! CCLayer::init)

		/*省略了很多程式碼*/
		
		CCSprite* fish = new CCSprite;
		CCLOG("retainCount after new: %d",fish->retainCount());
		this->setTsprite(fish);
		
        bRet = true;
    } while (0);

    return bRet;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    //CCDirector::sharedDirector()->end();
	CCLOG("retainCount after click button: %d",m_Tsprite->retainCount());
}

除錯後輸出日誌如下圖:


三、在呼叫retain()方法後其引用計數值加1,呼叫release()方法後計數值減一。需要注意的是呼叫autorelease()方法後物件的引用計數值並沒有

立即減1,但是在下一幀開始前,物件會被釋放掉。

1.測試程式碼如下:

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //////////////////////////////////////////////////////////////////////////
        // super init first
        //////////////////////////////////////////////////////////////////////////

        CC_BREAK_IF(! CCLayer::init());

		/*省略了很多程式碼*/


		CCSprite* fish = new CCSprite;
		CCLOG("retainCount after new: %d",fish->retainCount());
		//fish->init();
		//CCLOG("retainCount after init: %d",fish->retainCount());
		fish->retain();
		CCLOG("retainCount after retain: %d",fish->retainCount());
		fish->release();
		CCLOG("retainCount after release: %d",fish->retainCount());
		fish->autorelease();
		CCLOG("retainCount after autorelease: %d",fish->retainCount());
		this->setTsprite(fish);
        bRet = true;
    } while (0);

    return bRet;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    //CCDirector::sharedDirector()->end();
	CCLOG("retainCount after click button: %d",m_Tsprite->retainCount());
}

2.除錯後,輸入日誌如下圖(經測試init不會影響到引用數值):



備用,也希望能幫助到大家。

相關推薦

Cocos2d-x記憶體管理機制1

Cocos2d-x版本:cocos2d-2.1rc0-x-2.1.3 windows下測試。 VS版本:VS2010. .在Cocos2d記憶體管理中使用的引用計數機制,每個物件都包含一個用來控制生命週期的引用計數器,它就是CCObject的成員變數m_uReference

自動記憶體管理機制1- java記憶體區域與虛擬機器物件

自動記憶體管理機制(1)- java記憶體區域與虛擬機器物件 1. 執行時資料區域 Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。有的區域隨著虛擬機器進行的啟動而存在,有些區域則以來使用者執行緒的啟動和結束而建立和銷燬。 有以下幾個區域

iOS開發中的ARC記憶體管理機制1——基礎概念

由於移動裝置的記憶體資源一般比較少,所以垃圾回收機制的操作會對裝置的效能造成比較明顯的影響,有可能在執行垃圾回收的時候讓移動裝置出現卡頓,這對於使用者來說是很難受的事。 由此蘋果公司提出了ARC方案。 0x01 自動引用計數 自動引用計數(Automatic Ref

我所理解的Cocos2d-x Cocos2d-x 記憶體管理機制

C++記憶體管理 C++顯式堆記憶體管理 效能上有一定優勢,但有如下缺點: 野指標:指標指向的內容已經被釋放,但是其他指標還可能指向它。 重複釋放:重複釋放一個已經釋放的記憶體單元,或者釋放一個野指標,都會導致C++執行時錯誤。 記憶體洩露:不再被使用的

自動記憶體管理機制5- 虛擬機器效能監控

自動記憶體管理機制(5)- 虛擬機器效能監控 0. 概述 在我們日常開發的專案中,有時經常會碰到以下問題: OOM(OutOfMemoryError),記憶體不足 記憶體洩漏 執行緒死鎖 Lock Contention,鎖爭用 Java程序消耗CP

自動記憶體管理機制4- 記憶體分配和回收策略

自動記憶體管理機制(4)- 記憶體分配和回收策略 Java所承諾的自動記憶體管理主要是針對物件記憶體的回收和物件記憶體的分配。 在Java虛擬機器的五塊記憶體空間中,程式計數器、Java虛擬機器棧、本地方法棧記憶體的分配和回收都具有確定性,一般在編譯階段就能確定需要分配的記憶體大小,

自動記憶體管理機制3-HotSpot垃圾收集器

自動記憶體管理機制(3)-HotSpot垃圾收集器 如果說收集演算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的具體實現。 這裡討論的收集器都是JDK1.7(包含JDK1.7)以後的HotSpot虛擬機器: 上半部屬於新生代收集器,下半部屬於老年代收集器。如果兩個收集器

自動記憶體管理機制2- 記憶體回收和垃圾收集演算法

自動記憶體管理機制(2)- 記憶體回收和垃圾收集演算法 1. 概述 首先思考三個問題: 哪些記憶體需要回收 什麼時候回收 如何回收 程式計數器、虛擬機器棧、本地方法棧是執行緒私有的,因此這幾個區域的記憶體分配和回收都具有確定性(執行緒結束時執行垃圾回

深入理解java虛擬機器之自動記憶體管理機制

垃圾收集演算法     java中的記憶體是交給虛擬機器管理的。要實現垃圾回收,必須考慮如下三個問題:     1. 哪些記憶體需要回收?     2. 什麼時候回收?     3. 怎麼回收?     對於第一點,往大了來說,是堆和方法區的記憶體需要回收。往具體了來說,是堆中哪些物件的記憶體可以回

深入理解java虛擬機器之自動記憶體管理機制

  各類垃圾收集器與GC日誌 (一)垃圾收集器   一、Serial收集器     最基本、歷史最悠久的收集器。使用複製演算法,用在新生代,通常老年代用Serial old配合。GC過程需要stop the world。適用於client模式下的虛擬機器。   二、ParNew收集器  

深入理解java虛擬機器之自動記憶體管理機制

記憶體分配與回收策略 (一)記憶體分配策略     給誰分配?分配到哪?是記憶體分配策略必須解答的問題。     java物件是分配的物件,往大方向來說,是分配到堆中,更細一點說,根據物件不同的特點分配到新生代和老年代區域。如果啟動了本地執行緒分配緩衝,就按執行緒優先在TLAB上分配。     一、新

java記憶體管理機制-執行時資料區

前言   本打算花一篇文章來聊聊JVM記憶體管理機制,結果發現越扯越多,於是分了三遍文章(文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8),本文為其中第一篇。from java記憶體管理機制(一)-執行時資料區    1、 java記憶體管理機制-執行時資料區

python深入之python記憶體管理機制重點

關於python的儲存問題 (1)由於python中萬物皆物件,所以python的儲存問題是物件的儲存問題,並且對於每個物件,python會分配一塊記憶體空間去儲存它 (2)對於整數和短小的字元等,python會執行快取機制,即將這些物件進行快取,不會為相同的物件分配多個

輕量級作業系統FreeRTOS的記憶體管理機制

本文由嵌入式企鵝圈原創團隊成員朱衡德(Hunter_Zhu)供稿。FreeRTOS多種記憶體管理機制中最簡單的一種:全域性宣告一個靜態陣列ucHeap,然後通過指標偏移記錄空間的分配情況,在這種記憶體機

java虛擬機器記憶體管理機制:JVM記憶體管理總結【分享】

近期看了看Java記憶體洩露的一些案例,跟原來的幾個哥們討論了一下,深入研究發現JVM裡面還是有不少以前不知道的細節,這裡稍微剖析一下。先看一看JVM的內部結構——如圖所示,JVM主要包括兩個子系統和兩個元件。兩個子系統分別是Class loader子系統和Execution

輕量級作業系統FreeRTOS的記憶體管理機制

 本文由嵌入式企鵝圈原創團隊成員朱衡德(Hunter_Zhu)近幾年來,FreeRTOS在嵌入式作業系統排行榜中一直位居前列,作為開源的嵌入式作業系統之一,它支援許多不同架構的處理器以及多種編譯工具鏈,

你必須瞭解的java記憶體管理機制-垃圾標記

本文在個人技術部落格不同步釋出,詳情可用力戳 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩... 相關連結(注:文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8) 1、 你必須瞭解的java記憶體管理機制-執行時資料區 2、 你必須瞭解的java記憶體管理機制-記

你必須瞭解的java記憶體管理機制-垃圾回收

本文在個人技術部落格不同步釋出,詳情可用力戳 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩... 相關連結(注:文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8) 1、 你必須瞭解的java記憶體管理機制-執行時資料區 2、 你必須瞭解的java記憶體管理機制-記

【python測試開發棧】python記憶體管理機制—引用計數

什麼是記憶體 在開始進入正題之前,我們先來回憶下,計算機基礎原理的知識,為什麼需要記憶體。我們都知道計算機的CPU相當於人類的大腦,其運算速度非常的快,而我們平時寫的資料,比如:文件、程式碼等都是儲存在磁碟上的。磁碟的存取速度完全不能匹配cpu的運算速度,因此就需要一箇中間層來適配兩者的不對等,記憶體由此而來

【python測試開發棧】—python記憶體管理機制—垃圾回收

在上一篇文章中(python 記憶體管理機制—引用計數)中,我們介紹了python記憶體管理機制中的引用計數,python正是通過它來有效的管理記憶體。今天來介紹python的垃圾回收,其主要策略是引用計數為主,標記-清除和分代回收為輔助的策略(熟悉java的同學回回憶下,其實這和JVM的策略是有類似之處的)