日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【玩转cocos2d-x之十九】从CCObject看cocos2d-x的拷贝机制

發布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【玩转cocos2d-x之十九】从CCObject看cocos2d-x的拷贝机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創作品,轉載請標明http://blog.csdn.net/jackystudio/article/details/13295505


CCObject在之前的文章中出現了N次,它扮演了一個老祖宗的角色,但是它到底是做什么的?先從它看看cocos2d-x的拷貝機制吧。


1.CCCopying

CCObject從CCCopying繼承而來,而CCCopying擁有唯一的一個成員虛函數copyWithZone,這個函數可以認為是拷貝的一個協議,所有繼承了CCObject并且需要實現拷貝功能的子類都可以通過它來實現,它的源碼很簡單,就是一個未實現的斷言。CCZone是神馬?只是封裝了一個CCObject對象指針而已。

[cpp]?view plaincopy
  • CCObject*?CCCopying::copyWithZone(CCZone?*pZone)??
  • {??
  • ????CC_UNUSED_PARAM(pZone);??
  • ????CCAssert(0,?"not?implement");??
  • ????return?0;??
  • }??

  • 2.CCObject的子類拷貝問題

    再看看CCObject中copy的實現,是的,直接調用了copyWithZone,所以子類在處理拷貝問題時只需要對copyWithZone進行實現,使用時調用copy即可。

    [cpp]?view plaincopy
  • CCObject*?CCObject::copy()??
  • {??
  • ????return?copyWithZone(0);??
  • }??

  • 3.CCArray示例

    這里以CCArray的拷貝為例,CCArray繼承于CCObject,如上所說,我們只需要實現copyWithZone,然后在拷貝時調用copy即可實現CCArray的拷貝。


    3.1.CCArray拷貝時調用copy

    [cpp]?view plaincopy
  • CCArray*?CCArray::createWithArray(CCArray*?otherArray)??
  • {??
  • ????CCArray*?pRet?=?(CCArray*)otherArray->copy();//copy調用了copyWithZone??
  • ????pRet->autorelease();??
  • ????return?pRet;??
  • }??

  • 3.2.copyWithZone的實現

    可以看出CCArray采用的是深拷貝的方式。

    [cpp]?view plaincopy
  • CCObject*?CCArray::copyWithZone(CCZone*?pZone)??
  • {??
  • ????CCAssert(pZone?==?NULL,?"CCArray?should?not?be?inherited.");??
  • ????CCArray*?pArray?=?new?CCArray();??//new一個存放拷貝的空間??
  • ????pArray->initWithCapacity(this->data->num?>?0???this->data->num?:?1);//初始化一樣的長度??
  • ??
  • ????CCObject*?pObj?=?NULL;??
  • ????CCObject*?pTmpObj?=?NULL;??
  • ????CCARRAY_FOREACH(this,?pObj)//遍歷CCArray成員??
  • ????{??
  • ????????pTmpObj?=?pObj->copy();//逐個拷貝??
  • ????????pArray->addObject(pTmpObj);//添加到新拷貝pArray中??
  • ????????pTmpObj->release();??
  • ????}??
  • ????return?pArray;//返回拷貝??
  • }??

  • 4.深拷貝和淺拷貝

    其實不單是CCArray,cocos2d-x采用的都是深拷貝的方式,深拷貝和淺拷貝的概念和詳解請移步http://blog.csdn.net/jackystudio/article/details/11553117。它們的區別在于當前對象是否包含了對其他資源的引用。在拷貝機制上采用深拷貝的方式,大大方便了我們對內存的管理,避免因資源的釋放導致引用異常。這對于平時在進行一些自定義子類的拷貝處理上還是很有指導意義的。

    總結

    以上是生活随笔為你收集整理的【玩转cocos2d-x之十九】从CCObject看cocos2d-x的拷贝机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。