数组是常用的数据结构,如果不适用字面量语法,那么就要这样来创建数组:
NSArray *animals = [NSArray arrayWithObjects:@"zhangsan", @"lisi", nil];
而使用字面量语法来创建则是:
NSArray *animals = @[@"zhangsan", @"lisi"];
上面这种做法不见简单,而且还利于操作数组。数组的常见操作就是取某个下标所对应的对象,这用字面量来做更为容易。如果不用字面量,那么通常会用“objectAtIndex:”方法:
NSString *zhangsan = [animals objectAtIndex:0];
若使用字面量,则是:
NSString *zhangsan = animal[0];
这也叫做"取下标"操作(subscripting),与使用字面量语法的其他情况一样,这种方式也更为简洁、更易理解,而且与其他语言中依下标来访问数组元素时所用的语法类似。
不过,用字面量语法创建数组时要注意,若数组元素对象中有nil,则会抛出异常,因为字面量语法实际上只是一种“语法糖”(syntactic sugar),其效果等于是先创建了一个数组,然后把方括号内的所有对象都加到这个数组中。抛出的异常会是这样:
*** Terminating app due to uncaught exception
'NSInvalidArgumentException',reason: '***
-[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]'。
在改用字面量语法来创建数组时就会遇到这个问题。下面这段代码分别以两种语法创建数组:
id object1 = ...;
id object2 = ...;
id object3 = ...;
NSArray *array1 = [NSArray arrayWithObjects: object1, object2, object3, nil];
NSArray *array2 = @[object1, object2, object3];
如果object1与object3都指向了有效的Objective-C对象,而object2是nil,那么会出现什么情况呢?按字面量语法创建数组array2时会抛出异常。array1虽然可以创建出来,但是其中却只含有object1一个对象。原因在于,"arrayWithObjects:"方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束;这个微妙的差别表明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后才发现元素个数少了要好,向数组中插入nil通常说明程序有错,而通过异常可以更快地发现这个错误。