define 宏&&替代宏

编写代码时经常要定义常量

static const NSTimeInterval KAnimationDuration = 0.3;
复制代码
  1. 使用类型变量,可以清楚地描述常量的含义,以及它的类型。

  2. 命名法:若常量局限于某“编译单元”(translation unit,也就是实现文件,.m文件)之内,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。

  3. 变量一定要同时用staticconst来声明。如果试图对const后面的变量修改,则编译器会报错。static && const区别

  4. 如果不加static,若另一个编译单元文件中也声明了同名变量,编译器会报错

  5. 如果要对外公开某个常量,则需要使用extern 关键字在头文件中声明,然后在实现文件中定义。

     从右向左来理解,
     extern NSString * const constValue;
     constValue 是一个指针,
     const 只修饰右边的值,表明是只读,不能被修改
     NSString 指明常量类型,指向NSString 对象
     extern 指明可以被外部访问。编译器会明白无需查看其定义,就可以使用此常量。
    复制代码
  6. 此类常量必须要定义,而且只能定义一次。通常将其定义在与声明该常量的头文件相对应的实现文件里。由实现文件生成目标文件时,编译器会在数据段(data section)为字符串分配存储空间。链接器会把此目标文件与其他目标文件相链接,以生成最终的二进制文件。凡是用到这个全局符号的地方,链接器都能将其解析。

static && const && define

static:

  1. 是用来声明静态变量,也叫做内部全局变量,一般只会在实现文件(.m文件)中出现。

  2. 静态变量只会初始化一次

  3. 在方法内,修饰局部变量,会延长变量的生命周期,程序结束才会销毁,

  4. 在方法外,修饰全局变量,会修改变量的作用域,在整个文件,所有方法内都可以访问该变量。

  5. 静态变量属于静态存储方式,跟全局变量一样存储在静态存储区。

     - (void)increasing {
    
         int b = 0;
         static int a = 0;
         
         a ++;
         b ++;
         
         NSLog(@"====%d===%d", a, b);
     }
     
     [self increasing];	//====1===1
     [self increasing];	//====2===1
    复制代码

const:

  1. 修饰右边的变量

  2. 被const修饰的变量是只读的

  3. 一般都使用 NSString * const constValue;

     //constValue 不可变,*constValue 可变
     NSString * const constValue;
     
     //constValue 可变,*constValue 不可变
     const NSString * constValue;
     
     //都不可变
     const NSString * const constValue;
    复制代码

define

  1. 只是在预处理器里进行文本替换,没有类型,不做任何类型检查,大量宏会导致二进制文件变大。

  2. 宏可以定义一些函数和方法。

     # define DLog(fmt, ...)  NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
    复制代码

总结:

1. 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译据此执行查找与替换操作。如果有人重新定义了常量值,编译器也不会产生警告,可能会导致应用程序中的常量值不一致

2. 在实现文件中使用static const 来定义“只在编译单元内可见的常量”。

3. 在头文件中使用extern来声明全局变量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区别,通常用与之相关的类名做前缀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>