Effective objective-C:item4:常量 vs 预处理

#define ANIMATION_DURATION 0.3


static const NSTimeInterval kAnimationDuration=0.3;

比较上面两个有何区别呢?

1.#define是预处理。 

   C语言中有四步:预处理,编译,汇编,链接。

   只要导入过 .h 只要是遇到了这个 ANIMATION_DURATION都会用0.3去替换掉。

   ANIMATION_DURATION 是个什么类型的东西,不知道。

   此时,编译器还没有上场。

2.static const NSTimeInterval kAnimationDuration=0.3;

   优点:(1)知道类型。  type

     (2) 有太多常量去定义时,方便别人阅读。

    a.为什么用kAnimationDuration,前面加个k呢?

    这是因为,这个kAnimationDuration 是只给特定的.m文件去使用的;这个.m(实现文件)是一个translation unit(翻译单元)。

    b.为什么kAnimationDuration不放在 .h文件中呢?

    。。。。。

    在.m中定义,不会暴露给别人。 

    c.修饰符:

const : 这是一个常量,不容改变;

static:  表明这个变量 is local to the translation unit in which it is defined.


        const 好理解,来看一下static?

        首先来看一下 static 的英文解释:

        

static ['stætik]
  • adj.
    • [亦作 statical]
    • 静止的;停滞的
    • 稳定的,不变的;很少变化的
    • 不活泼的;缺乏活力的
    • 静态的;静力的
    • 固定的;在固定位置(或地面)进行的
    • 恬静的,安静舒适的
    • (水)贮于无压水箱中的

此时我们选择第6个解释,固定的,在固定位置的。


 

  

  报错了哟!如果没有写static, compiler多手多脚,加了一个extern.

  实际过程中,如果加入了static 修饰, 编译器就像在预处理过程中一样,将出现kAnimationDuration的地方,替换成0.3; 编译器根本不会创建一个符号。



3.那如果想暴露一个常量呢?

  





如上所示。

Student.m中如果 #import "EOCLoginManager.h"时,都可以看见那个变量。

全局所见。

global symbol table.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值