出自Effective Objective-C 2.0
#define ANIMATION_DURATION 0.3
复制代码
使用预处理指令会把源代码中的ANIMATION_DURATION替换为0.3,但是这样定义出来的常量没有类型信息.此外,加入该指令声明在某个头文件内,那么所有引入这个头文件的代码中,其ANIMATION_DURATION都会被替换掉.
解决方法:
static const NSTimeInterval kAnimationDuration = 0.3;
复制代码
上面的代码定义了一个类型为NSTimeInterval的常量.这种方式定义的常量包含了类型信息,好处是清楚的描述了常量的含义.
常用的命名法: 若常量局限于某"编译单元"(translation unit也就是"实现文件", implementation file)之内,则在前面加字母k, 若常量在类之外可见,则通常以类名为前缀.
如果不打算公开某个常量,则应将其定义在使用该常量的实现文件里.
#import "EOCAnimatedView.h"
static const NSTimeInterval kAnimationDuration = 0.3;
@implementation EOCAnimatedView
@end
复制代码
变量一定要同时使用static与const来声明.static表示只能在本文件内访问,文件作用域.const修饰的变量是不能被修改,如果修改了编译器就会报错.如果不加static,那么编译器会为它创建一个"外部符号"(external symbol),如果另一个编译单元也声明同名变量,那么编译器就会抛出如下错误消息:
总结如下:
1. 如果只是在.m文件中使用的常量那么使用static const 来修饰.
2. 如果在X.m文件中创建了一个常量const NSUInteger kAnimationRepeatCount = 3;,
希望外部文件访问,那么可以使用const来修饰,那么如果A.m文件要 访问X.m文件中创建的常量kAnimationRepeatCount,
可以在A.m文件中声明一下 extern const kAnimationRepeatCount; 那么就可以获取到kAnimationRepeatCount该常量的值
extern const kAnimationRepeatCount;的意思是声明kAnimationRepeatCount该常量是一个外部的.
3. 使用#define,只会进行替换,并且没有类型提示.
复制代码