《Effective Objective-C 2.0 》 阅读笔

2016-03-05  本文已影响71人  dibadalu

第4条:多用类型常量,少用#define预处理指令

1. 用#define预处理指令定义常量

#define ANIMATION_DURATION 0.3;

解释:常量没有类型信息,并且其含义不明确。此外,在预处理过程中会把碰到的所有ANIMATION_DURATION一律替换成0.3。

2. 类型常量

static const NSTimeInterval kAnimationDuration = 0.3;

解释:这种方式定义的常量包含类型信息,且清楚地描述了常量的含义。

3.类型常量的命名

3.1 常量局限于某“编译单元”(即实现文件)

若不打算公开某个常量,则应将其定义在使用该常量的实现文件里。

如:

static const NSTimeInterval kAnimationDuration = 0.3;

变量一定要同时用static与const来声明。

实际上,如果一个变量既声明为static,又声明为const,那么编译器根本不会创建符号,而是会像#define预处理指令一样,把所有遇到的变量都替换为常值。

3.2 常量在类之外可见

有时候需要对外公开某个常量。最常见的例子是:用字符串来表示通知的名称,并将其声明为一个外界可见的常值变量。这样,只需以常量变量来注册自己想要接收的通知即可。
此类常量需放在“全局符号表”(global symbol table)中,以便可以在定义该常量的编译单元之外使用。

如:

/* 头文件 “声明”  */
extern NSString *const EOCLoginManagerDidLoginNotification;

/* 实现文件 “定义”  */
NSString *const EOCLoginManagerDidLoginNotification = @"EOCLoginManagerDidLoginNotification";

这样,所定义的常量要优于使用#define预处理指令。因为编译器会确保常量值不变。

要点

上一篇 下一篇

猜你喜欢

热点阅读