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