2012-01-25 45 views
4

默認情況下,當您要求新的ObjC類時,Xcode會同時創建.h和.m文件。直到你需要到別處指任何C++文件在您的項目,並開始#進口將其投入或者您的.H或.m文件從來沒有創建ObjC文件但總是創建ObjC++文件的缺點?

在這一點上,ObjC編譯武功心亂如麻 一切正常,並引發山解析錯誤,而你的用戶(也就是說,我)會更加困惑,直到它碰到我爲止:當然,我應該使該文件成爲ObjC++文件。

的選項有:

  1. 告訴Xcode中,這個特殊的文件,即使它是一個.m文件 確實是一個ObjC++文件,或
  2. 重命名文件.mm。

第一種選擇是不是很可口給我,因爲該文件確實的ObjC++不管該項目認爲它是什麼。

第二個選項不好,因爲它搞砸了Git回購,然後'忘記'以前有另一個.m文件,這真的是這個'新'.mm文件的歷史。

所以我決定從現在開始總是重新命名任何.m文件,Xcode爲我創建.mm創建它之後的第一件事,這樣我就不會失去歷史。

到目前爲止,它對我來說效果不錯,但是我的腦海裏有這種輕微的擔心,可能會出現一些我真的想要ObjC文件而不是ObjC++文件的情況。

那些角落案件會是什麼?任何人都知道任何ObjC++文件不會包含任何C++引用,但會以某種方式窒息ObjC編譯器,只是憑藉.mm文件?

如果沒有缺點,爲什麼不直接棄用.m而是堅持使用.mm呢?

回答

2

雖然有兩種方法代表你創建(.cxx_construct.cxx_destruct),但它們僅用於在創建/釋放實例時製作和銷燬C++對象。如果你的類沒有C++成員,那麼這些函數什麼也不做,只會增加非常低的開銷。否則,您仍然會爲您的Objective-C方法生成C函數,而不是C++函數。

3

解析C++比解析ObjC慢得多,所以ObjC++文件的編譯時間明顯更長。我不確定這種開銷是否適用於不包含C++的ObjC++文件,但是它會讓人有一定的感覺,因爲編譯器需要查找C++結構,所以很難解析它。

此外,C++類型系統與C有一些稍微不同的規則,它們也適用於C++文件中的ObjC/C代碼。我不記得細節,但它不會有害。只是可能需要一些額外的演員。

2

創建一個Objective-C++文件模板,以便在創建新文件時獲得.mm文件而不是.m文件。複製Apple的Objective-C類模板並將.m文件重命名爲.mm。創造的Xcode 4文件模板的更多詳細信息,請在下面的文章:

Creating Custom Xcode 4 File Templates

+0

這是一個很好的建議。任何提示,以避免我的新.mm模板在下一次Xcode更新被覆蓋/銷燬? – verec

+0

將模板放置在用戶模板文件夾中,其位置在我鏈接到的文章中提到,應該足以防止在將來的Xcode更新中覆蓋您的模板。 –

+0

哦,我的!只是忽略了那一點。非常感謝! – verec

1

語言不兼容一邊,一個理由,以避免完全.mm項目是你最後可能會被誘惑,開始的部分你的方法在C++中,這將導致一個項目用一種(相對模糊的)兩種語言混合編寫,只有懂得兩者的人才能理解。 (我之前做過)

避免使用C++混淆obj-c頭文件的一個好方法是在實現文件中聲明實例變量(可能來自xcode 4.2/clang 3.0,可能更早)。例如:

@implementation MyClass { 
    std::vector<int> myVector; 
} 

這有助於保持objective-c和C++之間的接觸點最小化。

1

我使用.mm文件專門用於我的iOS代碼,並且從來沒有任何問題。是的,我的編譯速度稍慢一點,因爲乾淨的編譯需要15秒鐘和10秒鐘。至少在iMac上,這並不重要。