本文章简括了《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》书中的一些使用规范,具体使用方法可参考书中相应内容,或自行google。
熟悉Objective-C对象、消息及运行期
1)类的头文件中尽量少引入其它头文件
A)某个类头文件包含另一个类属性,用@class表明该属性是个类即可(向前声明)。
B)如果无法使用向前声明,如声明某个类遵循一项协议,尽量把协议移至分类或单独起文件。
2)多用字面语法
A)NSNumber *charNumber = @‘a’ 总比 NSNumber *charNumber = [NSNumber numberWithChar:@‘a’] 简洁的多
B)NSArray/ NSDictionary 也一样。取值可直接使用下标,且如果数为nil时会崩溃,容易排查。(如果使用arrayWith/dictionaryWith 遇到第一个nil值后面的值就会忽略,影响会更大)
3)多用类型常量,少用#define预处理指令
A)例如:static const NSTimeInterval kAnimationDuration = 0.3
规范:实现文件中用k开头,类之外可见用类名为前缀。
注意点:一定要用static 和 const 两个关键字声明。static表明仅在定义此变量的编译单元中可见。如果不加static,编译器会为它创建一个外部符号。此时若是另一个编译单元也声明了同样的变量,则会出错。
B)如果需要对外公开这个变量,可以这样使用:
头文件:extern NSString *const MyTestNotification;
实现文件:NSString *const MyTestNotification = @“ThisMyTestNotification”
4)用枚举表示状态/选项/状态码
A)可以借助系统的宏(具备向后兼容能力):
NS_ENUM(NSUIntefer, MyState){**, **, **};
NS_OPTIONS(NSUInteger, MyState){** =1<<0, **=1<<1};
注意:用switch语句的枚举,不要使用default分支。此时编译器会警告有的状态未处理。
5)在对象内部尽量直接访问实例变量
A)在对象内部读取数据时,应该直接通过实例变量来读,而写入数据时,则应通过属性来写。
B)在初始化init和dealloc方法中,总是直接访问实例变量来读取数据。
6)在自有类中使用关联对象存放自定义数据
A)可以通过关联对象机制把两个对象连接起来。
B)只有在其它做法不可行的时候才使用关联对象,因为关联对象容易引起难查的bug
7)消息转发机制
8)方法交换技术method swizzling
A)一般来说,只有调试程序的时候才需要在运行期间修改方法实现,这种做法不宜滥用。
9)类对象
A)尽量使用类型信息查询方法(isKindOfClass)来确定对象类型,而不要直接比较类对象。因为某些对象可能实现了消息转发功能。