《Effective Objective-C 2.0》2、数据的定义方法

第三条:多用字面量语法,少用等价的方法

这部分所描述的是创建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";

你可能感兴趣的:(ios,Objective-C,全局变量)