1.了解Objective-c 语言的起源
Objective-c与C++、Java等面向对象语言类似,不过很多方面有所差别。
Objective-c | Java等其他对象语言 | |
---|---|---|
消息结构 | 函数调用 | |
其运行时所应执行的代码由 | 运行环境来决定 | 编译器决定 |
- Objective-c为C语言添加了面向对象特性,是其超集。Objective-c使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息后,究竟应执行何种代码,由运行环境而非编辑器决定。
- 理解C语言的内存模型和指针有利于学号Objective-c
2.在类的头文件中尽量少的引用其他头文件
将引入头文件的时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所徐引入的头文件数量。(尽量别在.h文件中引入其他头文件,一方面为了减少编译时间,使用@class xxx,另一方面防止两个类互相引用)
3.多用字面量语法,少用与之等价的方法
字面量也叫语法糖,好处在于缩减源代码长度,精简,易读。
NSNumber *someNum = [NSNumber numberWithInt:1];
NSNumber *somenum = @1;
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil];
NSArray *arr0 = @[@"1",@"2"];
NSString *str = [arr objectAtIndex:1];
NSString *str0 = arr0[1];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
NSDictionary *dic0 = @{@"key0":@"value0",@"key1":@"value1"};
NSString *dicStr = [dic objectForKey:@"key0"];
NSString *dicStr0 = dic[@"key0"];
* 对于数组,如果值中有nil,会有以下情况
NSString *obj0 = @"0";
NSString *obj1 = nil;
NSString *obj2 = @"2";
NSArray *arr = [NSArray arrayWithObjects:obj0,obj1,obj2, nil];
那么arr数组里面只有一个元素obj0,因为遇到第二个元素是nil,就会停止后面的导入,且程序不会报错,这就造成安全的隐患。
如果用语法糖,面对这种情况,程序会抛出异常,便于查找和解决问题。
* 字典中也是类似的情况
局限性:字面量语法有个小小的限制,就是除了字符串以外,所创建出来的对象必须属于Foundation框架才行。
- 应该使用字面量语法来创建字符串,数值,数组,字典。与常规方法相比,这么做更加简明扼要。
- 应该通过取下标操作来访问数组下标或者字典中的键所对应的元素。
- 用字面量语法创建数组或者字典时,若值中有nil,则会抛出异常。因此,务必确保值里不含nil。
4.多用类型常量,少用#define预处理指令
编写代码时经常要定义常量,比如定义动画时长常量
#define ANIMATION_DURATION 0.5
这种方法是可以实现想要的效果,但是这样定义没有类型信息,不易被之后的阅读者理解,
static const NSTimeInterval kAnicationDuration 0.5
用此方法定义的常量包含类型信息,其好处是清楚的描述了常量的含义。如果有许多常量,此种写法能令阅读代码的人更易理解其意图。
常量的命名法:若常量局限于某个类里面,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。
变量一定要同时用static与const来声明。如果试图修改const修饰符所声明的变量,那么编译器就会报错。static修饰符则意味着该变量仅在此变量所在的类中可用
如果要公开一个常量,即全局常量,则这样定义
在头文件中声明
extern NSString *const EOCStringConstant;
在实现文件中定义
NSString *const EOCStringConstant = @"value";
- 不要用预处理指令定义常量。
- 在.m文件中使用 static const 来定义只在本类中使用的常量。(不用为其加名称前缀,加k)
- 在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。(用相关类名做前缀)
5.用枚举标识状态、选项、状态码
Objective-C基于C语言,所以它也可以使用枚举类型:enum。系统框架中总能看到它的身影,但是开发者却容易忽视它,枚举用的好的话,不仅使代码看起来更加规范,明了,而且使得程序逻辑更加清晰易读
typedef NS_ENUM(NSUInteger,personType) {
personTypeOne,//=0
personTypeTwo=5,//=5
personTypeThree//=6
};
手工指定某个枚举成员所对应的值,不适用编译器所分配的序号(默认第一个为0,之后递增1)
还有一种情况应该使用枚举类型,那就是定义选项的时候。如果这些选项可以互相组合,则更应如此。
typedef NS_OPTIONS(NSUInteger, personStatus) {
personStatus0 = 1 << 0,//=1 0001
personStatus1 = 1 << 1,//=2 0010
personStatus2 = 1 << 2,//=4 0100
personStatus3 = 1 << 3//=8 1000
};
personStatus personSta = personStatus0 | personStatus2;
NSLog(@"%ld",personSta);//打印结果 5
- 凡是需要以按位或操作组合的枚举都应使用NS_OPTIONS定义、。若是枚举不需要互相组合,则应使用NS_ENUM来定义。
我们总习惯在switch语句最后加上default分支,然而这是不好的。应为当我们在枚举中又添加一个新的状态时,如果有default这个分支,那么它就会处理这个新状态。从而导致编译器不发警告信息,这就容易出现漏洞,发生错误却不知道哪里出错。如果去掉这个default分支,编译器就会发出警告信息,提示新加入的状态并未在switch分支中处理。
- 应该用枚举来表示状态,选项,状态码。起个易懂的名字
- 如果选项可以互相组合,则使用NS_OPTIONS
- 定义的时候自己给其赋初值,可以不使用编译器给的默认的值
- 最好不用default分支,起到提醒作用