oc與c++混編,拋棄.mm文件

寫這片文章的起因是箫锤,有些朋友不想使用oc++的全部.mm文件的寫法贬蛙,固才有這種混編的轉(zhuǎn)化的方法前期準備:

  1. 首先建立一個新工程,編譯,運行谚攒,ok 沒問題阳准,進入第2步
  2. 我建立了一個 "COCFile.m" 的文件,用來儲存oc語言的代碼,代碼如下:

"COCFile.h"

#import <Foundation/Foundation.h> 

@interface COCFile : NSObject{    

 NSString  * name_;    
 NSNumber  * count_;
}

@property (nonatomic, readwrite,copy) NSString  * name_;
@property (nonatomic, readwrite,retain) NSNumber  * count_;
@end

"COCFile.m"

#import "COCFile.h"
@implementation COCFile
@synthesize name_;
@synthesize count_;

-(id) init{
   if(self = [super init])    {        
        name_ = @"text";        
       count_ = [NSNumber numberWithInt:3];    
   }
   return self;
}
@end

編譯馏臭,測試沒問題野蝇,我們進入下一步

state_1: 頭文件內(nèi)不包含oc 語言的混編

  1. 我們建立一個 "COCFile_State_1.cpp" 的中轉(zhuǎn)類,將尾綴修改為".mm ".并將頭文件放到 "HelloWorldScene.m"中,編譯測試括儒。沒問題绕沈,下一步。
  2. 在 "COCFile_State_1”創(chuàng)建一個c++的類帮寻,你可以選擇用普通或者是單例都沒問題.那么我們需要在這個類中調(diào)用 "COCFile" 的oc的代碼乍狐,代碼如下

"COCFile_State_1.h"

  #include <iostream>
  #include "CSingleton.h"
  class CState_1 : public Singleton
  {
   public:
    const char * getName();    
    int getCount();
    const char *  getMode();
  };

"COCFile_State_1.mm"

  #import "COCFile.h"
  #include "COCFile_State_1.h"

  const char * CState_1::getName(){ 
      COCFile * file = [[[COCFile alloc]init]autorelease]; 
      return [file.name_ UTF8String];
  }

  int CState_1::getCount(){
      COCFile * file = [[[COCFile alloc]init]autorelease];
      return [file.count_ intValue];
  }

  const char *  CState_1::getMode(){
      return [[UIDevice currentDevice].model UTF8String];
  }
  1. 這樣就可以在"HelloWorldScene"中調(diào)用這2個方法來獲取原來在oc中的數(shù)據(jù)了.代碼如下:
const char * name = CState_1::getInstance()->getName();
 int count = CState_1::getInstance()->getCount();
 const char * mode = CState_1::getInstance()->getMode();
 CCLOG("name = %s",name);
 CCLOG("count = %d",count);
 CCLOG("mode = %s",mode);


 輸出如下:
 Cocos2d: name = text
 Cocos2d: count = 3
 Cocos2d: mode = iPhone Simulator

備注:這里舉的例子可能不夠恰當(主要是跟state2做對比),因為這種混編的情況比較實用于oc是單例類的情況规婆。例如系統(tǒng)設備的 "UIDevice" 等比較合適.

state_2:頭文件也需要被包含的情況,其實這就是一個轉(zhuǎn)化澜躺,只需要在多包含一層就可以了,然后轉(zhuǎn)化成state_1 來解決

1.我們建立一個 "COCFileState_2_Mid.mm" 的中間類抒蚜,用來封裝oc的代碼掘鄙, 代碼很簡單如下:

"COCFileState_2_Mid.h"

#include "CSingleton.h"
#import "COCFile.h"
class CState_2_Mid :public Singleton{
private:
  COCFile * m_ocFile;
  ~CState_2_Mid();
public:
  CState_2_Mid();
  COCFile getFile();
};

"COCFileState_2_Mid.mm"

CState_2_Mid::~CState_2_Mid(){
  [m_ocFile release];
  m_ocFile = NULL;
}

CState_2_Mid::CState_2_Mid(){ 
   m_ocFile = [[COCFile alloc]init];
}

COCFile * CState_2_Mid::getFile(){
    return m_ocFile;
}

2.下面的方法估計你看了會感覺很熟悉,是的 下面就是重復state_1那就直接上代碼嘛

"CState_2.h"

#include < iostream >
#include "CSingleton.h"

class CState_2:public Singleton{

public:
  const char * getName();
  int getCount();
};

"CState_2.mm"

#include "COCFileState_2.h"
#import "COCFileState_2_Mid.h"

const char * CState_2::getName(){
  COCFile * file = CState_2_Mid::getInstance()->getFile();
  return [file.name_ UTF8String];
}

int CState_2::getCount(){
  COCFile * file = CState_2_Mid::getInstance()->getFile();
  return [file.count_ intValue];
}

3.這樣就可以在HelloWorldScene中調(diào)用這2個方法來獲取原來在oc中的數(shù)據(jù)了嗡髓。代碼如下:

const char * name_1 = CState_2::getInstance()->getName();
int count_1 = CState_2::getInstance()->getCount();
CCLOG("name_1 = %s",name_1);
CCLOG("count_1 = %d",count_1);

輸出如下:
Cocos2d: name_1 = text
Cocos2d: count_1 = 3</pre>

OC轉(zhuǎn)c++就是這兩種情況操漠。C++轉(zhuǎn)oc也是類似的情況。

思考:

  1. 其實我們可以仔細看一眼state_2的步驟2,3和state_1的步驟2,3有什么區(qū)別?
  2. 有沒有發(fā)現(xiàn)其實拋去方法來看浊伙,他們都只是一個遵守一個規(guī)則的撞秋?

原則:c++寫在 .cpp中, oc 寫在.m 中嚣鄙,oc與c++混編那么就需要.mm吻贿。

那么我在c++中調(diào)用c++的代碼總沒問題把,這樣只需要.cpp就可以了. oc的同理
所以哑子,你只需要想盡一切辦法 將oc的方法 轉(zhuǎn)化成一個個c/c++接口來給c++調(diào)用就可以了舅列。
好吧就寫道這里了。估計現(xiàn)在你應該很清楚怎樣去混編c++與oc 了

另:可能上面步驟比較羅嗦卧蜓,但我還是比較喜歡這種小步進步帐要,步步為營的方式,這樣不會出現(xiàn)非常嚴重的問題弥奸,也不會突然束手無策榨惠。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盛霎,隨后出現(xiàn)的幾起案子赠橙,更是在濱河造成了極大的恐慌,老刑警劉巖摩渺,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件简烤,死亡現(xiàn)場離奇詭異剂邮,居然都是意外死亡摇幻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門挥萌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绰姻,“玉大人,你說我怎么就攤上這事引瀑】裼螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵憨栽,是天一觀的道長帜矾。 經(jīng)常有香客問我,道長屑柔,這世上最難降的妖魔是什么屡萤? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮掸宛,結果婚禮上死陆,老公的妹妹穿的比我還像新娘。我一直安慰自己唧瘾,他們只是感情好措译,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布别凤。 她就那樣靜靜地躺著,像睡著了一般领虹。 火紅的嫁衣襯著肌膚如雪规哪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天塌衰,我揣著相機與錄音由缆,去河邊找鬼。 笑死猾蒂,一個胖子當著我的面吹牛均唉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肚菠,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼舔箭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚊逢?” 一聲冷哼從身側(cè)響起层扶,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烙荷,沒想到半個月后镜会,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡终抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年戳表,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昼伴。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾旭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出圃郊,到底是詐尸還是另有隱情价涝,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布持舆,位于F島的核電站色瘩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逸寓。R本人自食惡果不足惜居兆,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望席覆。 院中可真熱鬧史辙,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耙蔑,卻和暖如春见妒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甸陌。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工须揣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钱豁。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓耻卡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牲尺。 傳聞我的和親對象是個殘疾皇子卵酪,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容