詳解iPhone開發(fā)之Objective-C和 C 混編
詳解iPhone開發(fā)之Objective-C和C混編是本文要介紹的內容,主要介紹了iphone開發(fā)中的Objective-C和C混編,不多說,先來看詳細內容。
蘋果的Objective-C編譯器批準用戶在統(tǒng)一個源文件里自由地混雜利用C++和Objective-C,混編后的語言叫Objective-C++。有了它,你就能夠在Objective-C利用過程中利用已有的C++類庫。
Objective-C和C++混編的關鍵
在 Objective-C++中,能夠用C++代碼調用措施也能夠從Objective-C調用措施。在這兩種語言里對象都是指針,能夠在任何地方利用。例如,C++類能夠利用Objective-C對象的指針作為數據成員,Objective-C類也能夠有C++對象指針做實例變量。下例解釋了這一點。
當心:Xcode必需源文件以".mm"為伸展名,這么能力啟用編譯器的Objective-C++伸展。
- #import <Foundation/Foundation.h>
- class Hello {
- private:
- id greeting_text; // holds an NSString
- public:
- Hello() {
- greeting_text = @"Hello, world!";
- }
- Hello(const char* initial_greeting_text) {
- greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];
- }
- void say_hello() {
- printf("%s/n", [greeting_text UTF8String]);
- }
- };
- @inte***ce Greeting : NSObject {
- @private
- Hello *hello;
- }
- - (id)init;
- - (void)dealloc;
- - (void)sayGreeting;
- - (void)sayGreeting:(Hello*)greeting;
- @end
- @implementation Greeting
- - (id)init {
- if (immolation = [super init]) {
- hello = new Hello();
- }
- return immolation;
- }
- - (void)dealloc {
- delete hello;
- [super dealloc];
- }
- - (void)sayGreeting {
- hello->say_hello();
- }
- - (void)sayGreeting:(Hello*)greeting {
- greeting->say_hello();
- }
- @end
- int main() {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- Greeting *greeting = [[Greeting alloc] init];
- [greeting sayGreeting]; // > Hello, world!
- Hello *hello = new Hello(xj.xjwmz.com"Bonjour, monde!");
- [greeting sayGreeting:hello]; // > Bonjour, monde!
- delete hello;
- [greeting release];
- [pool release];
- return 0;
- }
正如你能夠在OC接口中聲明C構造一樣,你也能夠在OC接口中聲明C++類。跟C構造一樣,OC接口中定義的C++類是大局范圍的,不是OC類的內嵌類(這與規(guī)范C(盡管不是C++)晉級嵌套構造定義為文件范圍是統(tǒng)一的)。
為了批準你基于語言變種條件化地編寫代碼,OC++編譯器定義了__cplusplus和__OBJC__預處理器常量,離別指定C++和OC。如前所述,OC++不批準C++類繼承自OC對象,也不批準OC類繼承自C++對象。
- class Base { };
- @inte***ce ObjCClass: Base ... @end // ERROR!
- class Derived: public ObjCClass ... // ERROR!
與 OC不同的是,C++對象是靜態(tài)種類的,有運行時多態(tài)是特異情形。兩種語言的對象模型因而不能直接接受。更大約的,OC和C++對象在內存中的格局是互不相容的,也即便說,等閑不可能創(chuàng)立一個對象實例從兩種語言的角度來看都是管用的。因而,兩種種類層次構造不能被混雜。
你能夠在OC類內部聲明C++類,編譯器把這些類當作已聲明在大局名目空間來看待。就像下面:
- @inte***ce Foo {
- class Bar { ... } // OK
- }
- @end
- Bar *barPtr; // OK
OC批準C構造作為實例變量,不管它是否聲明在OC聲明內部。
- @inte***ce Foo {
- struct CStruct { ... };
- struct CStruct bigIvar; // OK
- } ... @end
Mac OS X 10.4爾后,萬一你設置fobjc- call-cxx-cdtors編譯器符號,你就能夠利用包括虛函數和故含義的用戶自定義零參數構造函數、析構函數的C++類實例來做為實例變量(gcc-4.2默認設置編譯器符號fobjc-call-cpp-cdtors)。OC成員變量alloc完爾后,alloc函數會按聲明次序調用構造器。構造器利用公共無參數穩(wěn)妥的構造函數。OC成員變量dealloc之前,dealloc措施按聲明次序反序調用調用析構函數。 OC沒知名目空間得觀念。不能在C++名目空間內部聲明OC類,也不能在OC類里聲明名目空間。
OC類,協議,分類不能聲明在C++ template里,C++ template也不能聲明在OC接口,協議,分類的范圍內。
然而,OC類能夠做C++ template的參數,C++ template參數也能夠做OC消息表白式的空氣壓縮機接收者或參數(不能穿越selector)。
C++詞匯歧義和抵觸
OC頭文件中定義了一些標識符,所有的OC過程定然包括的,這些標識符識id,Class,SEL,IMP和BOOL。
OC措施內,編譯器預聲明了標識符immolation和super,就想C++中的關鍵字this。跟C++的this不同的是,immolation和super是上下文相干的;OC措施外他們還能夠用于等閑標識符。
協議內措施的參數列表,有5個上下文相干的關鍵字(oneway,in,out,inout,bycopy)。這些在其他內容中不是關鍵字。
從 OC過程員的角度來看,C++添置了不少新的關鍵字。你依舊能夠利用C++的關鍵字做OC selector的一局部,因而波及并不嚴重,但你不能利用他們命名OC類和實例變量。例如,盡管class是C++的關鍵字,然而你依舊能夠利用 NSObject的措施class:
- [foo class]; // OK
然而,因為它是一個關鍵字,你不能用class做變量名目:
- NSObject *class; // Error
OC里類名和分類名有獨自的命名空間。@inte***ce foo和@inte***ce(foo)能夠同時存在在一個源代碼中。OC++里,你也能用C++中的類名或構造名來命名你的分類。
協議和template標識符利用語法雷同但目標不同:
- id<someProtocolName> foo;TemplateType<SomeTypeName> bar;
為了避免這種籠統(tǒng)之處,編譯器不批準把id做template名目。最后,C++有一個語法歧義,當一個label后面跟了一個表白式表示一個大局名目時,就像下面:
- label: ::global_name = 3;
第一個冒號后面必需空格。OC++有相仿情形,也必需一個空格:
- receiver selector: ::global_c++_name;
局限
OC++ 未曾為OC類添置C++的功能,也未曾為C++類添置OC的功能。例如,你不能用OC語法調用C++對象,也不能為OC對象添置構造函數和析構函數,也不能將this和immolation互相輪換利用。類的系統(tǒng)構造是自力更生的。C++類不能繼承OC類,OC類也不能繼承C++類。另外,多語言失常處理是不扶持的。也就是說,一個OC拋出的失常不能被C++代碼捉拿,反到來C++代碼拋出的失常不能被OC代碼捉拿。尤其是那些能夠輕率在閱讀代碼的時候覺察的訛謬,這些訛謬經常不輕率穿越機器上的測驗分辨出來。
小結:詳解iPhone開發(fā)之Objective-C和C混編的內容介紹完了,希望本文對你有所幫助!