歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Objective-C在LLVM 3.1中的新特性

Objective-C在LLVM 3.1中的新特性

日期:2017/3/1 10:20:12   编辑:Linux編程
與C和C++不同,Objective-C中不是由一個標准組織控制的,它一開始完全被Stepstone公司掌控,然而現在卻被Apple公司取代了。 這種完全被一個公司掌控的模式可以算是一個優點和或者缺點。例如,C++規范的新版本的C + +11,歷時13年完成。相比之下,Objective-C中可以發展地非常迅速,無需由委員會設計的問題所限制。但對應的缺點是在整個設計過程中,因為沒有監督,所以基本上無法被標准化的程序語言所接納。
好了,讓我們來看看 LLVM 3.1為 Objective-C 帶來了哪些增強吧。
NSNumber 常量 有個Objective-C的問題我被別人問了幾乎25年了,就是創建OC常量的語法。 先讓我們看看下面這行代碼: 1 id str = @"This is a string";


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


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


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


這到底是為什麼?因為對於整數是不能像字符串那樣處理的;這只是個讓程序員方便的語法糖而已,能讓我們創建一個 autoreleased 的NSNumber對象。在 Objective-C 11中,如果你定義下面這樣的宏,代碼如下: 1 #define N(x) _Generic((x), \ 2 int: [NSNumber numberWithInt: x], \ 3 float: [NSNumber numberWithFloat: x], \ 4 double: [NSNumber numberWithDouble: x])
這個例子接受一個數值參數然後返回一個NSNumber的對象,以下的代碼都是等價的 01 x = N(12); 02 03 x = <A class=referer href="http://my.oschina.net/mutou4" target=_blank>@12</A> ; 04 05 x = N(42.5); 06 07 x = @42.5; 08 09 x = N(42.5f); 10 11 x = @42.5f;


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