------<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)。此时若是另一个编译单元中也声明了同名变量,那么编译器就抛出一条错误消息:
如果想创建能被别的文件访问的常量, 此类常量需放在“全局符号表”(global symbol table)中,以便可以在定义该常量的编译单元之外使用。因此,其定义方式与上例演示的static const有所不同。应该这样来定义:
- duplicate symbol _kAnimationDuration in:
- EOCAnimatedView.o
- EOCOtherView.o
这个常量在头文件中“声明”,且在实现文件中“定义”。注意const修饰符在常量类型中的位置。常量定义应从右至左解读,所以在本例中,EOCStringConstant就是“一个常量,而这个常量是指针,指向NSString对象”。这与需求相符:我们不希望有人改变此指针常量,使其指向另一个NSString对象。
- // In the header file
- extern NSString *const EOCStringConstant;
- // In the implementation file
- NSString *const EOCStringConstant = @"VALUE";
编译器看到头文件中的extern关键字,就能明白如何在引入此头文件的代码中处理该常量了。这个关键字是要告诉编译器,在全局符号表中将会有一个名叫EOCStringConstant的符号。也就是说,编译器无须查看其定义,即允许代码使用此常量。因为它知道,当链接成二进制文件之后,肯定能找到这个常量。
总之就是用常量,而不用#define
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------