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

------<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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值