编写代码的时候我们经常需要定义常量,而当某一个常量会多次用到的时候最科学的办法是将它提取出来,方便日后的维护和增强代码的可读性。
也许我们会这么做:
#define TABLEVIEW_HEIGHT 600
#define TABLEVIEW_WIDTH 600
这样做的好处是写起来快、方便。我们通常叫#define
指令为预处理指令,预处理过程会将项目中所有引入该头文件的TABLEVIEW_HEIGHT
替换成600。所以要想更好的处理这个问题,我通常采用下面的方法:
static const CGFloat kTableviewHeight = 600.0;
采用这种方法比起预处理指令
有2个好处。
- 更加清楚描述了常量的含义,一看便知常量的类型为
CGFloat
- 按照命名习惯(naming convention)在编译单元即
.m
文件内,常量上加字母k
,若需要在多个文件可见则通常加上类名为前缀。
在适当的地方定义常量位置也是一种很不错的代码风格。在头文件里声明#define
指令这种做法很可能会导致名称互相冲突,而且会随着项目代码量增多会越来越不好管理。同时,在Object-C种没有“namespace”的概念,所以在头文件内的TABLEVIEW_HEIGHT
相当于声明了一个全局变量。所以我们通常采用static const
的方法在.m
文件中声明常量。在OC中若变量同时用static
和const
修饰,编译器会将它所遇到的变量替换成常量值。
有时候我们还需要公开某个常量,例如NSNotificationCenter
的通知name,接收者需要知道这个name。这时候我们通常会定义一个"global symbol table",这个定义方式与 static const
方式有所不同:
//.h文件 MJRefresh源码中喜欢使用 UIKIT_EXTERN
extern NSString *const MKDidLoginnotification;
//.m文件
NSString *const MKDidLoginnotification = @"MKDidLoginnotification";
这里可以这么理解:MKDidLoginnotification是一个常量,这个常量的本质其实是一个指针(即指针常量),指向了一个NSString对象。
网友评论