笔记- 第3条 多用字面量语法,少用与之等价的方法(规范)

1、OC 以语法繁杂而著称。字面量语法即:NSString *someString = @“Objective-C 2.0”;

2、使用字面量语法可以缩减代码长度,使其更为易读。

3、字面量语法实际上只是一种“语法糖”。(语法糖:也成“糖衣语法”,是指计算机语言中与另外一套语法等效但是开发者用起来却更加方便的语法。语法糖可另程序更易读,减少代码出错率。)

4、
1. id object1 = /* ... /;
2. id object2 = /
... /;
3. id object3 = /
... */;
4.
5. NSArray *arrayA = [NSArray array WithObjects:
6. object1, object2, object3, nil];
7. NSArray *arrayB = @[object1, object2, object3];

大家想想:如果 object1 与 object3 都指向了有效的 Objective-C 对象,而 object2 是 nil,那么会出现什么情况呢?按字面量语法创建数组 arrayB 时会抛出异常。arrayA 虽然能创建出来,但是其中却只含有 object1 一个对象。原因在于,“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束。

这个微妙的差别表明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后才发现元素个数少了要好。向数组中插入nil通常说明程序有错,而通过异常可以更快地发现这个错误。(但是更容易崩溃?)

5、

    1.  NSDictionary *personData =  
    2.      [NSDictionarydictionaryWithObjectsAndKeys:  
    3.          @"Matt", @"firstName",  
    4.          @"Galloway", @"lastName",  
    5.          [NSNumber numberWithInt:28], @"age",  
    6.          nil]; 

这样写令人困惑,因为其顺序是<对象>,<键>,<对象>,<键>。这与通常理解的顺序相反,我们一般认为是把“键”映射到“对象”。因此,这种写法不容易读懂。如果改用字面量语法,就清晰多了:


    1.  NSDictionary *personData =  
    2.      @{@"firstName" : @"Matt",  
    3.        @"lastName" : @"Galloway",  
    4.        @"age" : @28}; 

与数组一样,用字面量语法创建字典时也有个问题,那就是一旦有值为nil,便会抛出异常。不过基于同样的原因,这也是个好事。
使用字面量语法的局限性:

6、字面量语法有个小小的限制,就是除了字符串以外,所创建出来的对象必须属于Foundation框架才行。如果自定义了这些类的子类,则无法用字面量语法创建其对象。要想创建自定义子类的实例,必须采用“非字面量语法”(nonliteral syntax)。然而,由于NSArray、NSDictionary、NSNumber 都是业已定型的“子族”(class cluster,参见第9条),因此很少有人会从其中自定义子类,真要那样做也比较麻烦。而且一般来说,标准的实现已经很好了,无须再改动。创建字符串时可以使用自定义的子类,然而必须要修改编译器的选项才行。除非你明白这样做的后果,否则不鼓励使用此选项,用 NSString 就足够了。

7、使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。若想要可变版本的对象,则需复制一份。
NSMutableArray *mutable = [@[@1, @2, @3, @4, @5] mutableCopy];
这么做会多调用一个方法,而且还要再创建一个对象。

要点
① 应该使用字面量语法来创建字符串、数值、数组、字典。与创建此类对象的常规方法相比,这么做更加简明扼要。
② 应该通过取下标操作来访问数组下标或字典中的键所对应的元素。
③ 用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。因此,务必确保值里不含 nil。

你可能感兴趣的:(笔记- 第3条 多用字面量语法,少用与之等价的方法(规范))