与C和C++不同,Objective-C中不是由一个标准组织控制的,它一开始完全被Stepstone公司掌控,然而现在却被Apple公司取代了。
这种完全被一个公司掌控的模式可以算是一个优点和或者缺点。例如,C++规范的新版本的C + +11,历时13年完成。相比之下,Objective-C中可以发展地非常迅速,无需由委员会设计的问题所限制。但对应的缺点是在整个设计过程中,因为没有监督,所以基本上无法被标准化的程序语言所接纳。
好了,让我们来看看 LLVM 3.1为 Objective-C 带来了哪些增强吧。
NSNumber 常量
有个Objective-C的问题我被别人问了几乎25年了,就是创建OC常量的语法。
先让我们看看下面这行代码:
<font face="Courier New">1</font> | id str = @ "This is a string" ; |
它运行起来当然没什么问题 -- 只是简单的创建一个静态的 NSConstantString 然后初始化变量值,并指派一个指针指向它。但是如果我们看看下面这一个呢?
<font face="Courier New">1</font> | <font face="Courier New">int</font> <font face="Courier New">x = 42;</font> |
这行代码也是存储常量值42到x中。按照开始说的,如果我们这么写.
<font face="Courier New">1</font> | <font face="Courier New">id x = @42;</font> |
结果看到以下报错
<font face="Courier New">1</font> | lit.m:3:8: error: initializer element is not a compile- time <font face="Courier New">constant </font> |
<font face="Courier New">2</font> | <font face="Courier New">id x = @42; </font> |
<font face="Courier New">3</font> | ^~~ |
这到底是为什么?因为对于整数是不能像字符串那样处理的;这只是个让程序员方便的语法糖而已,能让我们创建一个 autoreleased 的NSNumber对象。在 Objective-C 11中,如果你定义下面这样的宏,代码如下:
<font face="Courier New">1</font> | <font face="Courier New">#define N(x) _Generic((x), \ </font> |
<font face="Courier New">2</font> | int : [NSNumber numberWithInt: x], \ |
<font face="Courier New">3</font> | float : [NSNumber numberWithFloat: x], \ |
<font face="Courier New">4</font> | double : [NSNumber numberWithDouble: x]) |
这个例子接受一个数值参数然后返回一个NSNumber的对象,以下的代码都是等价的
<font face="Courier New">01</font> | <font face="Courier New">x = N(12); </font> |
<font face="Courier New">02</font> | <font face="Courier New"> </font> |
<font face="Courier New">03</font> | x = <A class =referer href= "http://my.oschina.net/mutou4" <font face="Courier New">target=_blank>@12</A> ; </font> |
<font face="Courier New">04</font> | <font face="Courier New"> </font> |
<font face="Courier New">05</font> | <font face="Courier New">x = N(42.5); </font> |
<font face="Courier New">06</font> | <font face="Courier New"> </font> |
<font face="Courier New">07</font> | <font face="Courier New">x = @42.5; </font> |
<font face="Courier New">08</font> | <font face="Courier New"> </font> |
<font face="Courier New">09</font> | <font face="Courier New">x = N(42.5f); </font> |
<font face="Courier New">10</font> | <font face="Courier New"> </font> |
<font face="Courier New">11</font> | <font face="Courier New">x = @42.5f;</font> |
同理你也可以为long, longS以及long doubleS等等来扩展这样的宏。甚至是更加复杂的数据。
这种宏定义的方式有两个好处,一时它可以以任何表达式的形式工作;第二就是它的表达意思的易理解性。
这种宏定义实际上是一个非常有用的功能。不幸的是,它看起来像刚刚赶到在半成品状态。在未来的版本,希望这一问题将得到解决。