自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解iPhone開發(fā)之Objective-C和 C 混編

移動開發(fā) iOS
本文介紹的是詳解iPhone開發(fā)之Objective-C和C混編,介紹了iphone開發(fā)中的Objective-C的內容,先來看內容。

詳解iPhone開發(fā)Objective-CC混編是本文要介紹的內容,主要介紹了iphone開發(fā)中的Objective-CC混編,不多說,先來看詳細內容。

蘋果的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++伸展。

  1. #import <Foundation/Foundation.h> 
  2. class Hello {  
  3. private:  
  4. id greeting_text; // holds an NSString  
  5. public:  
  6. Hello() {  
  7. greeting_text = @"Hello, world!";  
  8. }  
  9. Hello(const char* initial_greeting_text) {  
  10. greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];  
  11. }  
  12. void say_hello() {  
  13. printf("%s/n", [greeting_text UTF8String]);  
  14. }  
  15. };  
  16. @inte***ce Greeting : NSObject {  
  17. @private  
  18. Hello *hello;  
  19. }  
  20. - (id)init;  
  21. - (void)dealloc;  
  22. - (void)sayGreeting;  
  23. - (void)sayGreeting:(Hello*)greeting;  
  24. @end  
  25. @implementation Greeting  
  26. - (id)init {  
  27. if (immolation = [super init]) {  
  28. hello = new Hello();  
  29. }  
  30. return immolation;  
  31. }  
  32. - (void)dealloc {  
  33. delete hello;  
  34. [super dealloc];  
  35. }  
  36. - (void)sayGreeting {  
  37. hello->say_hello();  
  38. }  
  39. - (void)sayGreeting:(Hello*)greeting {  
  40. greeting->say_hello();  
  41. }  
  42. @end  
  43. int main() {  
  44. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  45. Greeting *greeting = [[Greeting alloc] init];  
  46. [greeting sayGreeting]; // > Hello, world!  
  47. Hello *hello = new Hello(xj.xjwmz.com"Bonjour, monde!");  
  48. [greeting sayGreeting:hello]; // > Bonjour, monde!  
  49. delete hello;  
  50. [greeting release];  
  51. [pool release];  
  52. 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++對象。

  1. class Base { };  
  2. @inte***ce ObjCClass: Base ... @end // ERROR!  
  3. class Derived: public ObjCClass ... // ERROR! 

與 OC不同的是,C++對象是靜態(tài)種類的,有運行時多態(tài)是特異情形。兩種語言的對象模型因而不能直接接受。更大約的,OC和C++對象在內存中的格局是互不相容的,也即便說,等閑不可能創(chuàng)立一個對象實例從兩種語言的角度來看都是管用的。因而,兩種種類層次構造不能被混雜。

你能夠在OC類內部聲明C++類,編譯器把這些類當作已聲明在大局名目空間來看待。就像下面:

  1. @inte***ce Foo {  
  2. class Bar { ... } // OK  
  3. }  
  4. @end  
  5. Bar *barPtr; // OK 

OC批準C構造作為實例變量,不管它是否聲明在OC聲明內部。

  1. @inte***ce Foo {  
  2. struct CStruct { ... };  
  3. struct CStruct bigIvar; // OK  
  4. } ... @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:

  1. [foo class]; // OK 

然而,因為它是一個關鍵字,你不能用class做變量名目:

  1. NSObject *class; // Error 

OC里類名和分類名有獨自的命名空間。@inte***ce foo和@inte***ce(foo)能夠同時存在在一個源代碼中。OC++里,你也能用C++中的類名或構造名來命名你的分類。

協議和template標識符利用語法雷同但目標不同:

  1. id<someProtocolName> foo;TemplateType<SomeTypeName> bar; 

為了避免這種籠統(tǒng)之處,編譯器不批準把id做template名目。最后,C++有一個語法歧義,當一個label后面跟了一個表白式表示一個大局名目時,就像下面:

  1. label: ::global_name = 3

第一個冒號后面必需空格。OC++有相仿情形,也必需一個空格:

  1. 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-CC混編的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2017-04-07 16:00:59

SwiftObjective-CFramework

2014-04-01 10:50:42

iOS開發(fā)runtimeObjective-C

2013-05-02 10:51:17

iOS開發(fā)Objective-C@property

2011-07-07 17:04:33

iPhone Action Objective-

2011-07-18 14:59:20

iPhone Objective-

2010-09-01 09:19:33

Objective-CiPhone開發(fā)iPhone

2011-07-25 17:31:49

iPhone Objective-

2011-07-08 18:44:09

Objective-C Self Super

2011-07-29 16:16:30

Objective-c block

2011-08-17 10:58:59

Objective-C構造函數

2011-08-03 16:22:05

Objective-C CodeBlocks

2011-08-04 13:38:01

Objective-C C++

2011-08-17 10:29:39

Objective-C預處理

2011-08-04 10:38:17

Objective-C 預處理程序

2013-07-24 19:19:03

Objective-CiOS開發(fā)動態(tài)特性之protoc

2014-09-26 09:49:48

SwiftObjective-C

2011-07-28 15:11:23

iOS Objective-

2011-07-18 16:36:51

Objective-C XCode

2015-10-08 10:01:10

Objective-CLayout

2011-07-06 11:19:45

Objective-C
點贊
收藏

51CTO技術棧公眾號