因为之前登陆错误账号的原因,原有账号已被弃用,所以文章要转到这里来。
我们使用Xcode开发程序时,总会用到几个Foundation框架的类:NSString、NSNumber、NSArray、NSDictionary。由于OC是C语言的超集,所以上诉的这几个类也完全能用C语言实现相同的功能,但是实际应用中这几个类也总是我们代码中的常客。另一方面,OC以语法繁杂而著称,例如我们使用NSString的常规声明如下:
看上去十分繁杂,令人头疼。有没有简便一点的办法呢?OC提供了一种非常简单的方式来创建这些对象,我们称之为“字面量语法”。其语法如下:
看上去跟C语言的常量字符串定义一样,这种让我们的代码看起来更加的简洁,而且功能上并没有任何差别。
另外,在使用NSKeyedArchiver进行数据存储时,我们要存储基本类型变量(如游戏存储高分成绩)时,我们需要把基本类型转换成NSNumber存储起来,字面量语法也可以帮助我们简单的创建对象:
输出:
在NSArray跟NSDictionary中字面量语法可以帮助我们更清晰的看明白元素组成:
对比传统的创建方法,我们可以清楚的看清楚NSArray的元素组成以及NSDictionary的键值关系。下面是使用字面量语法访问内部元素的比较:
在访问内部元素这一功能上字面量语法也是要比常规方法更为简洁方便的。那么,既然字面量语法这么好,它有没有缺点呢?答案是有的,这些错误具体有以下几个:
其一,在NSArray跟NSDictionary初始化中因为组成元素为空导致的编译错误。为了突出这种错误,我先使用常规方法进行创建:
输出结果:
结果说明了arrayWithObjects方法在创建数组的过程中依次将元素存入数组里,遇到nil就停止。那么接下来是字面量语法的创建,结果运行的时候程序crash了,错误信息如下:
attempt to insert nil object意为错误的将空对象插入数组之中,从这个错误信息里我们可以看出字面量语法对NSArray的初始化方式大致是先创建一个组成元素的数组,然后为array分配内存,将数组中的元素依次插入,具体的实现并不需要我们关心,只要知道不能在字面量语法创建数组时引入空对象就行了。那么字典的字面量语法错误跟数组的也是一样的,都会因为插入空对象而crash
其二,用字面量语法创建的对象是不可变长对象。如上面所演示的,接收字面量语法创建的对象没有一个是mutable类型的,但是我们需要的时候怎么办呢?代码如下:
虽然这种转化会多发送了一个方法,但是相较起字面量语法的好处来说,这点消耗是值得的。
其三:字面量语法仅限于Foundation框架的这四个类。这意味着即便我们创建了NSString的子类myString,我们也不能使用字面量语法来创建myString对象。
总而言之,我们在开发中应当使用字面量语法来创建NSArray、NSNumber、NSArray以及NSDictionary的对象,这样会使得我们的代码更加的简明扼要