黑马程序员 ---类中定义常量

来源:互联网 发布:全国青少网络文明公约 编辑:程序博客网 时间:2024/06/05 05:37

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

我今天在写程序时,我的类需要一个常量。比如一个person类,我需要定义一个常量g来说明人的成年年龄,老师教的都只能创建对象的成员变量,所有成员变量都是在对象初始化后才有值的,否者都是零,我不想再init方法中写一行代码来设置g为18.有没有其他方法呢?我想不用init,g就是20的那种方法。

查了资料发现,可以在类的定义文件,就是实现implementation的那个.m文件中,定义变量。

因为类的实现文件不会被任何代码import,所以这些变量其他文件是访问不到的,他们的作用域只是这个类的实现中。

这就弥补了oc中,类没法创建常量的尴尬。

const int g = 20;//这里定义的变量只能在这个文件访问,换句话说,只能是这个类访问它。@implementation XXXX@end


在《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法》中有一条多用类型常量,少用#define预处理指令

我觉得这条建议是很不错的。

    static const NSTimeInterval kAnimationDuration = 0.3; 

const关键字防止变量被修改,static关键字使这个变量只能在这个.m文件中有效,别的模块是访问不到它的。

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

  1. duplicate symbol _kAnimationDuration in:  
  2.     EOCAnimatedView.o  
  3.     EOCOtherView.o 
如果想创建能被别的文件访问的常量,此类常量需放在“全局符号表”(global symbol table)中,以便可以在定义该常量的编译单元之外使用。因此,其定义方式与上例演示的static const有所不同。应该这样来定义:

 

  1. // In the header file  
  2. extern NSString *const EOCStringConstant;  
  3.  
  4. // In the implementation file  
  5. NSString *const EOCStringConstant = @"VALUE"; 
这个常量在头文件中“声明”,且在实现文件中“定义”。注意const修饰符在常量类型中的位置。常量定义应从右至左解读,所以在本例中,EOCStringConstant就是“一个常量,而这个常量是指针,指向NSString对象”。这与需求相符:我们不希望有人改变此指针常量,使其指向另一个NSString对象。

编译器看到头文件中的extern关键字,就能明白如何在引入此头文件的代码中处理该常量了。这个关键字是要告诉编译器,在全局符号表中将会有一个名叫EOCStringConstant的符号。也就是说,编译器无须查看其定义,即允许代码使用此常量。因为它知道,当链接成二进制文件之后,肯定能找到这个常量。

总之就是用常量,而不用#define

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

0 0