iOS - define、 static、extern

3、static

  • 修饰局部变量
    - 1、使得局部变量只初始化一次
    - 2、局部变量在程序中只有一份内存
    - 3、局部变量的作用域不变,但是生命周期变了(直到程序结束才销毁)
  • 修饰全局变量
    • 1、全局变量的作用域仅限当前文件
    • 2、避免重复定义全局变量

4、extern作用:

  • 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
  • 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;
 
// static修饰全局变量
static int age = 20;
 
- (void)test
{
    // static修饰局部变量
    static int age = 0;
    age++;
    NSLog(@"%d",age);
}
 
- (void)viewDidLoad {
    [super viewDidLoad];
    [self test];
    [self test];
 
    extern int age;
    NSLog(@"%d",age);
}

5、static与const联合使用

  • static与const作用:声明一个只读的静态变量
  • 开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合
// 开发中常用static修饰全局变量,只改变作用域
// 为什么要改变全局变量作用域,防止重复声明全局变量。
// 开发中声明的全局变量,有些不希望外界改动,只允许读取。
// 比如一个基本数据类型不希望别人改动
 
// 声明一个静态的全局只读常量
static const int a = 20;
 
// staic和const联合的作用:声明一个静态的全局只读常量
 
// iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
 
// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。
static  NSString * const key = @"name";
 
// 如果 const修饰 *key1,表示*key1只读,key1还是能改变。
 
static  NSString const *key1 = @"name";

6、#define

#define   ANIMATION_DURAION   0.5

但是代码中并没有定义出常量的类型信息, duration这个词看上去和时间有关, 但是代码中, 又未明确指出
预处理指令会把碰到的所有ANIMATION_DURAION一律替换为0.5
要想解决此问题, 可以利用编译器的某些特性, 代码如下:

static const NSTimeInterval kAnimationDuration = 0.5;

这样定义的好处:
1.清晰的描述了常量的含义, 可以知道常量类型为NSTimeInterval, 这有助于为其编写开发文档
注意: 这里有一个命名习惯, 如果常量局限于"编译单元"(stranslation unit, 也就是实现文件之内), 则在字母前加字母k, 如果在类之外, 则通常以类名为前缀

总结:

  • 不要用预处理指定定义常量, 因为不含类型信息, 而且有人修改了常量值也不会报错
  • 在实现文件中使用static const来定义"只在编译单元内可见的常量", 由于此类常量不会在全局符号表中, 所以无需在命名时加前缀
  • 在头文件中使用extern来声明全局常量, 并在相关实现文件中定义其值, 这种常量要出现在全局符号表中, 其名称最好用相关的类名做前缀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值