关于Objective-C的常量

来源:互联网 发布:男神女神投票源码 编辑:程序博客网 时间:2024/04/30 18:29

这篇文章是在重拾程序员节操的一个总结,关于常量方法的问题。


其实,之前我们在使用常量的时候,基本没有太多的考虑,基本上就使用#define string xxx, 而如果需要区别类型的时候,一般都使用 static const int i =0; 之类的,没有考虑过内链、外链,访问区域,可变不可变等等的问题,甚至对这些都没有什么概念。

附上一些关于Coding 风格的一些材料

Google 开源项目风格指南 (中文版)

Introduction to Coding Guidelines for Cocoa

Constants in Objective-C 

关于Objective-C的常量,我目前了解的常用的主要由这几个关键字的组合 const,extern,static 或者直接使用 #define

1. 关于字符串、整型等基础类型的常量声明、定义
     
// Constants.hextern NSString *const MyConstant;     // Constants.mNSString *const MyConstant = @"MyConstant"; 

    这样做的主要优势是,在字符串常量的比较时,可以直接使用地址的比较,(stringInstance == MyConstant) 代替以前的字符串比较方式,([ stringInstance isEqualToString:myConstant ]),前者执行效率更高效。
  
   这里需要注意的是,const的声明方式:

NSString *const constant; //到 NSString 的 const 指针NSString  const *constant; //到 const  NSString 的指针const  NSString *constant;  //到 const NSString 的指针


     使用第一种方式,是指针不变,即地址不变,字符串的内容可以改变。

    当然也可以使用更快捷的方式:
   
// Constants.h           #define MyConstant "MyConstant"

     关于const 和 define 的主要区别,我也看了很多大牛的文章,主要总结如下

  • const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
  • 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
  • const/define: const常量有数据类型而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只是简单的字符替换,而且宏常量可能会导致边际效应。
  • 比通过宏预定义的优点是,可以对常量进行指针比较操作,这是#define做不到的
     
     还有一点需要注意的是,Objective-C 种const常量是外连接的,在标准C中const定义的变量是外连接的,即如果一个编译单元中定义了一个全局const常量,则其在其他编译单元中是可见的,如果其他编译单元也定义了同名const常量就会产生重复定义错误。这一点与C++不同,C++中const定义的变量是内连接的,即每个编译单元定义的全局const常量是自己独有的


----------------------------------------------------------------------------------------------------------------------------------------------------------
未完待续




原创粉丝点击