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修饰符则意味着该变量仅在定义此变量的编译单元中可见

2.如果不打算公开某个常量,应将其定义在使用该常量的实现文件里(如通知的名称)

//.h文件中
extern  NSString *const EOCStringConstant;//在头文件中“声明”
//.m文件中
NSString *const EOCStringConstant = @"VALUE";//在实现文件中“定义”

注意const修饰符在常量中的位置,常量定义应从右向左解读,所以,EOCStringConstant就是“一个常量,而这个常量是指针,指向NSString对象”

第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
};

这样做可以确保枚举使用开发者所选的底层数据类型是实现出来的,而不会采用编译器所选的类型

4.在处理枚举类型的switch语句中不要实现default分支

这样的话,加入新枚举后,编译器就会提示开发者:switch并未处理所有枚举。如果加上来default分支,那么他就会处理这个新状态,从而导致编译器不会发出警告

上一篇 下一篇

猜你喜欢

热点阅读