局部常量

在实现文件中使用 static const 来定义“只在编译单元内可见的常量”(translation-unit-specific constant)。其命名规则为在前面加字母k

//
// EOCAnimatedView.h
// #import <UIKit/UIKit.h> @interface EOCAnimatedView : UIView @end //
// EOCAnimatedView.m
// #import "EOCAnimatedView.h" static const NSTimeInterval kAnimataionDuataion = 0.5;
@implementation EOCAnimatedView @end
  • static const 与 #define

    • 编译时刻:#define是预编译(编译之前处理),const是编译阶段。

    • 编译检查:#define不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。

    • #define的好处:#define能定义一些函数,方法。 const不能。

    • #define的坏处:使用大量#define,容易造成编译时间久,每次都需要重新替换。

    • 在确定了使用的常量类型,及常量值时使用 const 进行定义;而简单的函数,或传参字符串等高级定义时,则使用#define进行宏定义。

全局常量

在头文件中使用extern const 来声明全局常量,并在相关实现文件中定义其值。其命名规则为以类名为前缀。

//
// EOCAnimatedView.h
// #import <UIKit/UIKit.h> extern NSString *const EOCAnimatedViewStringConstant;
extern const NSTimeInterval EOCAnimatedViewDuration; @interface EOCAnimatedView : UIView @end //
// EOCAnimatedView.m
// #import "EOCAnimatedView.h" NSString *const EOCAnimatedViewStringConstant = @"VALUE";
const NSTimeInterval EOCAnimatedViewDuration = 3.3; @implementation EOCAnimatedView @end

这个常量在头文件中"声明",且在实现文件中"定义".

注意const修饰符的位置,常量定义应该从右至左解读,所以在示例中, EOCAnimatedViewStringConstant就是"一个常量, 而这个常量是指针, 指向NSString对象".这与需求是相符的,因为我们不希望有人改变此指针常量.使其指向另外一个NSString对象.

还要说一点就是因为符号要放在全局符号表中,所以一定要注意常量的命名规范.避免名称冲突,最好使用与之相关的类名做前缀.系统框架中一般都是这么做的.

  • extern const 与 #define

  • #define只是简单的替换,又称作宏定义、预处理命令。

  • externconst联合使用时,const是要分配内存空间的,提示编译器遇到此变量和函数时在其他模块中寻找其定义

  • #define是不会对数据类型进行检查

  • externconst联合使用时,是会对数据类型进行安全检查

  • 在shared libraries的情况下,#define(相当于使用@""写法的“字面量”)不能保证得到的字符串地址是一样的。如果用@""的字符串作为dictionarykey的话,会导致它需要做isEqualToString的比较

  • shared libraries的情况下,用extern NSString * const,只要做指针的比较。显然指针比较比逐个字符比较快多了。

@""写法的字符串会在编译期被替换成NSConstantString的实例,NSString也是唯一一种可以在编译期被实例化的类

要点

  1. 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只会在编译前据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。

  2. 在实现文件中使用static const 来定义“只在编译单元内可见的常量”(translation-unit-specific constant)。一个编译单元就是一个.m文件。由于此常量不在全局符号表中,所以无需为其名称加前缀(在其前面加字母k)

  3. 在头文件中使用extern const来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区分,通常用与之相关的类名做前缀。

最新文章

  1. UDP(强行关闭了一个现有的连接远程主机)
  2. 如何在tomcat中如何部署java EE项目
  3. SQL Server 常用分页SQL
  4. nginx安装后出现502 Bad Gateway 错误解决办法
  5. 利用Splatting提交参数(Hash,哈希)
  6. win32程序中简单应用mfc
  7. Centos上安装jdk版本出错的问题
  8. react-native 打包成apk 文件
  9. 设计一个字符串类String(C++练习题)
  10. Pearls POJ - 1260 dp
  11. 20165312 2017-2018-2 《JAVA程序设计》第6周学习总结
  12. shell脚本--文件包含
  13. [学习笔记]Java代码中各种类型变量的内存分配机制
  14. Nodejs----单点登录
  15. 为JavaScript正名--读你不知道的JavaScript(持续更新..)
  16. Python开发【笔记】:探索Python F-strings
  17. [转]WCF Data Services OData
  18. “我爱淘”第二冲刺阶段Scrum站立会议3
  19. java 面向对象一
  20. 洛谷P4009 汽车加油行驶问题(分层最短路)

热门文章

  1. Android Activity启动耗时统计方案
  2. Mac破解软件下载的几个网站
  3. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
  4. Shiro使用Session缓存
  5. 简单说一下你对http和https的理解
  6. Python网络爬虫实战(四)模拟登录
  7. [C++]invalid initialization of non-const reference of type &#39;std::__cxx11::string&amp; {aka std::__cxx11::basi
  8. commons-beanutils.jar及其支持文件
  9. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
  10. ETL-Kettle学习笔记(入门,简介,简单操作)