Effective Objective-C 2.0总结
2018-01-23 本文已影响0人
啊_哈
第4条: 多用类型常量,少用#define预处理指令
1.尽量不要用预处理指令定义常量
#define ANIMATION_DURATION 0.3 //不含类型信息
定义出来的常量不含类型信息,编译器只会在编译器前查找并替换,如果有人重新定义了常量值,编译器也不会警告,这会使程序中的常量值不一致
static const NSTimeInterval KAnimationDuration = 0.3 //包含类型信息,清楚的描述了常量的含义
变量一定要同时使用static 和 const来声明,如果试图修改const修饰符所声明的变量,那么编译器就会报错,而static修饰符则意味着该变量仅在定义此变量的编译单元中可见
- 实际上,如果一个变量即声明为static,又声明为const,那么编译器根本不会创建符号,而是会像#define 预处理指令一样,把所有遇到的变量都替换成常量
2.如果不打算公开某个常量,应将其定义在使用该常量的实现文件里(如通知的名称)
//.h文件中
extern NSString *const EOCStringConstant;//在头文件中“声明”
//.m文件中
NSString *const EOCStringConstant = @"VALUE";//在实现文件中“定义”
注意const修饰符在常量中的位置,常量定义应从右向左解读,所以,EOCStringConstant就是“一个常量,而这个常量是指针,指向NSString对象”
- 此常量必须要定义,而且只能定义一次,通常将其定义在与声明该常量的头文件相关的实现文件中
- 这样定义常量要优于使用#define预处理指令,因为编译器会确保常量值不变
第5条:用枚举表示状态,选项,状态码
1.枚举只是一种常量命名方式
2.如果把传递给某个方法的选项表示为枚举类型,而多个选项又可以同时使用,那么就将各个选项定义为2的幂,以便通过“按位或操作符”将其组合起来
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
3.用NS_ENUM 与 NS_OPTION 宏来定义枚举类型,并指出其底层数据类型
/** 刷新控件的状态 */
typedef NS_ENUM(NSInteger, MJRefreshState) {
/** 普通闲置状态 */
MJRefreshStateIdle = 1,
/** 松开就可以进行刷新的状态 */
MJRefreshStatePulling,
/** 正在刷新中的状态 */
MJRefreshStateRefreshing,
/** 即将刷新的状态 */
MJRefreshStateWillRefresh,
/** 所有数据加载完毕,没有更多的数据了 */
MJRefreshStateNoMoreData
};
这样做可以确保枚举使用开发者所选的底层数据类型是实现出来的,而不会采用编译器所选的类型
- 凡是需要已按位或操作来组合的枚举都应该使用NS_OPTION 定义,若是枚举不需要互相组合,则应该使用NS_NEUM来定义
4.在处理枚举类型的switch语句中不要实现default分支
这样的话,加入新枚举后,编译器就会提示开发者:switch并未处理所有枚举。如果加上来default分支,那么他就会处理这个新状态,从而导致编译器不会发出警告