成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解iPhone開發之Objective-C和 C 混編

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

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

蘋果的Objective-C編譯器批準用戶在統一個源文件里自由地混雜利用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類的內嵌類(這與規范C(盡管不是C++)晉級嵌套構造定義為文件范圍是統一的)。

為了批準你基于語言變種條件化地編寫代碼,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++對象是靜態種類的,有運行時多態是特異情形。兩種語言的對象模型因而不能直接接受。更大約的,OC和C++對象在內存中的格局是互不相容的,也即便說,等閑不可能創立一個對象實例從兩種語言的角度來看都是管用的。因而,兩種種類層次構造不能被混雜。

你能夠在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函數會按聲明次序調用構造器。構造器利用公共無參數穩妥的構造函數。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; 

為了避免這種籠統之處,編譯器不批準把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互相輪換利用。類的系統構造是自力更生的。C++類不能繼承OC類,OC類也不能繼承C++類。另外,多語言失常處理是不扶持的。也就是說,一個OC拋出的失常不能被C++代碼捉拿,反到來C++代碼拋出的失常不能被OC代碼捉拿。尤其是那些能夠輕率在閱讀代碼的時候覺察的訛謬,這些訛謬經常不輕率穿越機器上的測驗分辨出來。

小結:詳解iPhone開發Objective-CC混編的內容介紹完了,希望本文對你有所幫助!

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

2017-04-07 16:00:59

SwiftObjective-CFramework

2014-04-01 10:50:42

iOS開發runtimeObjective-C

2010-09-01 09:19:33

Objective-CiPhone開發iPhone

2011-07-25 17:31:49

iPhone Objective-

2013-05-02 10:51:17

iOS開發Objective-C@property

2011-07-07 17:04:33

iPhone Action Objective-

2011-07-18 14:59:20

iPhone Objective-

2011-07-29 16:16:30

Objective-c block

2011-08-17 10:58:59

Objective-C構造函數

2011-07-08 18:44:09

Objective-C Self Super

2011-08-03 16:22:05

Objective-C CodeBlocks

2014-09-26 09:49:48

SwiftObjective-C

2011-07-28 15:11:23

iOS Objective-

2015-10-08 10:01:10

Objective-CLayout

2011-07-18 16:36:51

Objective-C XCode

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開發動態特性之protoc

2011-08-04 09:47:33

iOS Objective- JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 先锋av资源在线 | 精品欧美乱码久久久久久1区2区 | 亚洲精品久久久久久久不卡四虎 | 在线观看黄色大片 | 中文av在线播放 | 91久久久久久久久 | 久久久久久久久久久蜜桃 | 男女激情网站免费 | 精品毛片 | 国产精品久久 | 久久综合久久久 | 中文字幕亚洲无线 | 一区二区三区欧美在线 | 久久不卡| 日本亚洲精品成人欧美一区 | 日日操天天射 | 日本不卡一区 | 成人在线视频看看 | 成人精品福利 | 国产午夜精品理论片a大结局 | 99国产精品久久久久 | 国产精品久久久久久一级毛片 | 在线观看亚洲 | 一区二区在线免费观看 | 亚洲精品日韩一区二区电影 | av不卡一区| 亚洲区一区二区 | 天天av综合 | www.蜜桃av | 国产精品视频一二三区 | 午夜国产精品视频 | 日韩精品激情 | 一级a性色生活片久久毛片波多野 | 国产午夜精品视频 | 欧美一级欧美三级在线观看 | 91亚洲国产| 欧美精品一区二区三区四区 | 91精品在线看 | 欧美一区2区三区4区公司二百 | 日韩电影免费在线观看中文字幕 | 午夜影院在线观看 |