《Effective Objective-C 2.0 編寫高質量iOS與OS X的52個有效方法》讀書總結
第一章 熟悉的Objective-C
第3條:多用字面量語法,少用與之等價的方法
字符串字面量(string literal)
NSString *someStr = @"Effective Objective-C 2.0";
同樣,NSNumber、NSArray、NSDictionary類的實例也可以用這種字面量語法來聲明,不以常見的alloc及init方法來分配并初始化對象,這樣可以縮減源代碼長度,更為易讀。
字面數值
NSNumber *someNum = [NSNumber numberWithInt:1]; // 非字面量
NSNumber *intNum = @1;
NSNumber *floatNum = @2.5f;
NSNumber *doubleNum = @3.1415926;
NSNumber *boolNum = @YES;
NSNumber *charNum = @'a';
int x = 5; ? ?int y = 6.32f;
NSNumber *expressionNum = @(x*y);
字面量數組
NSArray*animals = [NSArray arrayWithObjects:@"cat", @"dog", @"pig", @"mouse", nil]; // 非字面量
NSArray*animals= [@"cat", @"dog", @"pig", @"mouse"];
NSString *dog = [animals objectAtIndex:1]; ?// 非字面量
NSString *dog = animals[1];
字面量語法實際上是一種“語法糖”(syntactic sugar),也稱“糖衣語法”,是指計算機語言中與另外一套語法等效但是開發者用起來更加方便的語法。可令程序更加易讀, 減少代碼出錯幾率。
問題
id object1 = /* …… */; ? ?// 有效
id object2 = /* …… */; ? ?// 空
id object3 = /* …… */; ? ?// 有效
NSArray *arrayA = [NSArray arrayWithObjects:object1, object2, object3, nil];
NSArray *arrayB = [object1, object2, object3];
這時,按字面量語法創建數組arrayB會拋出異常,arrayA雖然能夠創建出來,但是其中卻只有object1一個元素, 因為“arrayWithObjects:”方法會依次處理各個參數,直到發現nil為止。
所以,使用字面量語法更為安全,拋出異常令程序終止執行,比創建好數組之后發現元素少了要好。
字面量字典
NSDictionary *personDic = [NSDictionary dictionaryWithObjectsAndKeys:@"Sherry", @"name", @"20", @"age", @"female", @"gender", nil];? // 非字面量
NSDictionary *personDic = @{
? ? ? ? ? @"name":@"Sherry",
? ? ? ? ? @"age":@"20",
? ? ? ? ? @"gender":@"female",
}
NSString *name = [personDic objectForKey:@"name"];? // 非字面量
NSString *name = personDic[@"name"]
字典出現空值時跟數組相同。
可變數組與字典
[mutableArr replaceObjectAtIndex:1 withObject:@"tigger"];? // 非字面量
[mutableDic setObject:@“Tom” forKey@"name"];? // 非字面量
mutableArr[1] = @"tigger"
mutableDic[@"name"] = @"Tom";
局限性
除了字符創以外,所創建的對象必須屬于Foundation框架。自定義的這些類的子類,無法用字面量語法創建其對象。
創建可變版本對象時,需要復制一份
NSMutableArray *mutableArr = [@[@1, @2, @3, @4] mutableCopy];