《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];