博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令
阅读量:6444 次
发布时间:2019-06-23

本文共 1323 字,大约阅读时间需要 4 分钟。

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

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

 

使用例如:static const NSTimeInterval kAnimationDuration = 0.3;

在实现文件中使用 static const 来定义“只在编译单元内可见的常量”。由于此类常量不再全局符号表中,所以无须为其名称加前缀。

若常量局限于某“实现文件”之内,则在前面加字母 k,如kAnimationDuration ;若常量在类之外可见,则通常以类名为前缀。

 

含义:如果视图修改 const 所声明的变量,那么编译器就会报错。

      假如声明变量时不加 static 则 编译器会为它创建一个“外部符号”(external symbol),此时若另一个编译单元中也声明了同名变量,那么编译器就会抛出一条错误消息: duplicate symbol ——kAnimationDuration in :

              EOCAnimatedView.o

              EOCOtherView.o

   同时 声明为static 和const 则不会创建符号,作用域@define一样 且定义的常量带有类型信息。

     编译单元:每个类的实现文件(以 .m 为后缀名)

 

需要对外公开某个常量,此类常量需放在“全局符号表”(global symbol table)中,以便可以在定义该常量的变异单元之外使用。在头文件中使用 extern 来声明全局常量,并在相关实现文件中定义其值。 应用与之相关的类名做前缀。

  // In the header file

  extern NSString *const EOCStringConstant;        //在头文件中声明。

                               // EOCStringConstant 就是“一个常量,而这个常量是指针,指向NSString对象”

  // In the implementation file

  NSString *const EOCStringConstant = @"VALUE"     //在实现文件中 定义

 

extern 关键字,意思是告诉编译器在全局符号表中将会有一个名叫EOCStringConstant的符号。

     也就是说,编译器无序查看其定义,即允许代码使用此常量。因为它知道当链接成二进制文件之后,肯定能找到这个常量。

此 类常量必须定义且只能定义一次。由实现文件生成目标文件时编译器会在“数据段”(data section)为字符串分配空间。链接器会把此目标文件与其他目标文件相链接,以生成最终的二进制文件。凡是用到EOCStringConstant这 个全局符号的地方,连接器都能将其解析。

转载于:https://www.cnblogs.com/IDRI/p/5023070.html

你可能感兴趣的文章
项目三、基于PPTP技术的Linux ×××的构建
查看>>
优秀网站收集
查看>>
数码时×××创者大会花絮新鲜出炉
查看>>
sql语句的经验之谈
查看>>
微笑的国度――泰国
查看>>
windows服务器同步时间
查看>>
我的友情链接
查看>>
Qt下的OpenGL 编程(12)阶段学习总结
查看>>
马哥3-4
查看>>
DHCP
查看>>
Symantec Backup Exec 系列三:配置存储
查看>>
shell中的快捷键
查看>>
搭建Spring MVC 4开发环境八步走
查看>>
RequireJS 快速上手
查看>>
平时好好的接口,今天突然发现抽风了。。。
查看>>
Idea下SpringCloud2实验(三、Eureka+Fegin服务消费)
查看>>
bash编程脚本之三 read的应用
查看>>
linux关闭防火墙
查看>>
OpenCV3的机器学习算法SVM-使用Python
查看>>
LVM磁盘格式创建
查看>>