Objective-C在LLVM 3.1中的新特性

openkk 12年前發布 | 40K 次閱讀 Objective-C開發 Objective-C

與C和C++不同,Objective-C中不是由一個標準組織控制的,它一開始完全被Stepstone公司掌控,然而現在卻被Apple公司取代了。

這種完全被一個公司掌控的模式可以算是一個優點和或者缺點。例如,C++規范的新版本的C + +11,歷時13年完成。相比之下,Objective-C中可以發展地非常迅速,無需由委員會設計的問題所限制。但對應的缺點是在整個設計過程中,因為沒有監督,所以基本上無法被標準化的程序語言所接納。


好了,讓我們來看看 LLVM 3.1為 Objective-C 帶來了哪些增強吧。

NSNumber 常量
有個Objective-C的問題我被別人問了幾乎25年了,就是創建OC常量的語法。
先讓我們看看下面這行代碼:
 id str = @"This is a string";


它運行起來當然沒什么問題 -- 只是簡單的創建一個靜態的 NSConstantString 然后初始化變量值,并指派一個指針指向它。但是如果我們看看下面這一個呢?
int x = 42;


這行代碼也是存儲常量值42到x中。按照開始說的,如果我們這么寫.
id x = @42;


結果看到以下報錯
lit.m:3:8: error: initializer element is not a compile-time constant
id x = @42;
       ^~~


這到底是為什么?因為對于整數是不能像字符串那樣處理的;這只是個讓程序員方便的語法糖而已,能讓我們創建一個 autoreleased 的NSNumber對象。在 Objective-C 11中,如果你定義下面這樣的宏,代碼如下:
#define N(x) _Generic((x), \
      int: [NSNumber numberWithInt: x], \
      float: [NSNumber numberWithFloat: x], \
      double: [NSNumber numberWithDouble: x])

這個例子接受一個數值參數然后返回一個NSNumber的對象,以下的代碼都是等價的
x = N(12);

x = @12 ;

x = N(42.5);

x = @42.5;

x = N(42.5f);

x = @42.5f;


同理你也可以為long, longS以及long doubleS等等來擴展這樣的宏。甚至是更加復雜的數據。
這種宏定義的方式有兩個好處,一時它可以以任何表達式的形式工作;第二就是它的表達意思的易理解性。
這種宏定義實際上是一個非常有用的功能。不幸的是,它看起來像剛剛趕到在半成品狀態。在未來的版本,希望這一問題將得到解決。

原文鏈接, OSChina.NET原創翻譯
 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!