第三条:多用字面量语法,少用等价的方法
这部分所描述的是创建foundation类的对象时的技巧。Foundation框架是iOS中至关重要的框架,iOS应用中大部分数据都可以用foundation类表示。比较常用的有NSString、NSNumber、NSArray、NSDictionary等。除此之外对于字符串、矩阵、词典等集合类还有其"mutable"版本,如NSMutableString等,其特点是包含元素可以动态修改。
对于foundation类,新建一个对象可以同其他objective-c对象一样使用alloc+init方法。不过,使用字面量是一种更加有效的办法。
1、数值对象NSNumber:
NSNumber类可以封装整数、浮点数、字符、布尔值等类型。使用alloc+init方法新建一个NSNumber对象的方法:
NSNumber *num1 = [NSNumber numberWithInt:1];
使用字面语法的方法为:
NSNumber *num2 = @1;明显可以看出,使用字面量语法的代码更加简洁。
2、数组对象NSArray:
创建一个数组的方法有:
NSArray *animals = [NSArray arrayWithObjects:@"cat", @"dog",@"mouse",@"badger"];使用字面语法的方法:
NSArray *animals = @[@"cat", @"dog",@"mouse",@"badger"];也可以使用字面量语法将自定义的对象包含在数组内:
NSArray *arr = @[obj1, obj2, obj3];
需要注意的是,在这种情况下,如果中括号内有元素为nil则程序会抛出异常。不过这也有一个好处就是可以更方便地排查错误所在。
3、字典对象
NSDictionary类可以按照键值对的格式进行映射关系数据的存储,创建NSDictionary对象的方法:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];按照一般理解,通常的数据对应关系中“键”应该排在“值”的前面,因此上述写法并不是非常符合我们的习惯思维。使用字面量语法则好得多:
NSDictionary *dict = @[@"key1":@"value1",@"key2":@"value2",@"key3":@10];同数组对象相似,字面量表示字典也会产生nil元素导致抛出异常的问题,使用时需注意。
需要注意的是,字面量语法生成的对象都是不可变的。如果需要它的可变版本则需要做一次可变复制,例如:
NSMutableArray *mutableArr =[ @[@1,@2,@3] mutableCopy];
第四条:固定数值多用类型常量,少用宏定义
定义常量时通常有两种方式,其一是定义为一个宏,其二是定义一个常量表示:
#define VIEW_WIDTH 240 #define VIEW_HEIGHT 50 static const int kViewWidth = 240; static const int kViewHeight = 50;
如果采用宏定义的方法,那么这样的常量不包含数据类型,编译器会将出现宏的地方做一次简单替换。在代码的其他地方还可能进行重复宏定义,这种情况也很难排查。因此这并非一个好的办法。
使用常量则不存在这样的问题。此类常量通常由static和const修饰。static表示该常量仅仅在当前的源文件中有效,在其他源文件中不可见。如果没有static修饰符,则编译器将创建一个external symbol,如果另一个源文件中定义了同名符号将出现错误。const表示该变量实际为一个常量,任何视图修改其值的行为都将触发错误。
最后一点是常量不要定义在头文件中,而应定义在源文件中。如果某个常量需要对其他源文件公开,作为全局变量,应在头文件中声明,源文件中实现:
//var.h extern NSString *const SomeConstant; //var.m NSString *const SomeConstant = @"SomeString";