iOS开发中的宏与常量

常量在日常开发中用处那是非常的多,那常量应该如何定义呢?

这种估计是我们用的最多的一种方式,使用方便。

例如:

#define ANIMATION_TIME 10

我们设置动画时间为10秒,在使用时候有ANIMATION_TIME的地方都会被替换成10,请注意替换这个词。
也就是说在编译时候,会将一切宏定义替换成后面的内容。由于宏定义不会检查替换类型,只要遇到就替换。
另外宏可以重复定义,不能保证值不变。

有时候使用宏还会遇到意向不到的结果。宏定义的黑魔法


  • extern、const

创建Constants.h和Constants.m文件用来存放我们的常量。

在Constants.h中,指定常量名字,将常量声明为一个指向NSString对象的指针:

最后,在Constants.m中通过赋值定义常量:

// Constants.m
NSString * const kMyOwnConstant = @"myOwnConstant";
NSString * const kYetAnotherConstant = @“yetAnotherConstant";

使用的时候引入Constants.h便可使用常量了。

这里使用到extern c关键字,表示这个变量已经声明,只是引用。

const关键字表示变量是常量,不可修改。

在objc的约定里,常量也是大小写混排的驼峰命名规则,使用相关类做前缀,首字母小写,另外,第一个字母是k。

如果只是在方法内使用,只需这样定义:

static NSString * const kMyOwnConstant = @“myOwnConstant"

如果不想提供给外部使用则在Constants.h头文件中得声明去掉即可。


注意:

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

2、在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区隔,通常用与之相关的类名做前缀。(Objective-C中const常量是外连接的)


相比宏定义的好处:

1、可以进行指针比较(@”myString” == MyConstant)而不是字符串比较([@”myString” isEqualToString:MyConstant])。前者非常非常快。

2、人总会犯错。所以你就会容易输入错字符串,而编译器并不会抱怨你的语法。但如果使用常量,它就会在你输入错常量名称的时候给予你警告。XCode还会尽最大努力的帮助我们自动完成代码,这些常量也不例外,因此方法会变得非常方便。


名词解释:

extern:extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。来源:百度百科

宏:#define就是“替换”,在编译时,将一切宏定义替换成定义后面的内容。来源:百度百科


参考文章:

http://tutuge.me/2015/03/11/Effective-Objective-C-读书笔记-Item-4-如何正确定义常量/

http://blog.csdn.net/chowpan/article/details/25061839

http://book.2cto.com/201404/42075.html

 

 

尊重原创内容,转载请注明出处
本文链接地址: https://www.awnlab.com/archives/30

为您推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注