3、多用字面量語法,少用與之等價的方法
阿新 • • 發佈:2017-06-02
keys obj ble alloc ive 3.1 per 無法 bsp 1、字面字符串
摒棄:
NSString *someString = [[NSString alloc] initWithString: @"Effective Objective-C 2.0"];
提倡:
NSString *someString = @"Effective Objective-C 2.0";
2、字面數值
摒棄:
NSNumber *someNumber = [NSNumber numberWithInt: 1];
提倡:
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @‘a’;
亦可以
int x = 5;
float y = 6.32f;
NSNumber *expressionNumber = @(x * y);
3、字面量數組
摒棄:
NSArray *animals = [NSArray arrayWithObjects: @“cat”, @“dog”, @“mouse”, @“badger”, nil];
NSString *dog = [animals objectAtIndex: 1];
提倡:
NSArray *animals = @[@“cat”, @“dog”, @“mouse”, @“badger”];
NSString *dog = animals[1];
提示:
“arrayWithObjects:”方法會依次處理各個參數,直到發現nil為止。而字面量語法創建時如果有nil,則會拋出異常。這個微妙的差別表明,使用字面量語法更為安全。拋出異常令應用程序終止執行,這比創建好數組之後才發現元素個數少了要好。
4、字面量字典
摒棄:
NSDictionary *personData = [NSDictionary dictionaryWithObjectsAndKeys: @“Matt”, @“firstName”, @“Galloway”, @“lastName”, [NSNumber numberWithInt: 28], @“age”, nil];
NSString *lastName = [personData objectForKey: @“lastName"];
提倡:
NSDictionary *personData = @[email protected] : @“Matt”, @“lastName” : @“Galloway”, @“age” : @28}:
NSString *lastName = personData[@“lastName"];
提示:
跟字面量數組類似。
5、可變數組與字典
摒棄:
[animals replaceObjectAtIndex: 1 withObject: @“dog”];
[personData setObject: @“Jon” forKey: @“lastName”];
推薦:
animals[1] = @“dog";
personData[@“lastName”] = @“Jon”;
6、局限性
字面量語法有個小小的限制,就是除字符串之外,所創建出來的對象必須屬於Foundation框架才行。如果自定義了這些類的子類,則無法用字面量語法創建其對象。要創建自定義子類的實例,必須采用“非字面量語法”。然而,由於NSArray、NSDictionary、NSNumber都是業已定型的“子類”,因此很少有人會從其中自定義子類,真要這樣做也比較麻煩。而且一般來說,標準的實現已經很好了,無須再改動。
創建字符串時可以使用自定義的子類,然而必須要修改編譯器的選項才行。除非你明白這樣做的後果,否則不鼓勵使用此選項,用NSString就足夠了。
使用字面量語法創建出來的字符串、數組、字典對象都是不可變的。若想要可變版本的對象,則需要復制一份mutableCopy。這麽做會多調一個方法,而且還要再創建一個對象,不過使用字面量語法所帶來的好處還是多於上述缺點的。
3、多用字面量語法,少用與之等價的方法