美文网首页iOS面试汇总
OC中static、const、extern关键字理解

OC中static、const、extern关键字理解

作者: 这个优秀瓜 | 来源:发表于2017-08-30 18:34 被阅读36次

static关键字

static关键字用于修饰变量。

  • static修饰局部变量

    1. 当使用static修饰局部变量时, 改变了变量的生命周期(存储方式),即在编译时就为变量分配内存,直到程序退出时才释放存储单元。因此,在下次执行此代码块时,变量中能够有上一次存储的值。即变量有了记忆功能。
    2. 使用static修饰的变量仍然是局部变量,其作用域并未改变,仍然只能在代码块内部使用。
  • static修饰全局变量
    在此我们首先应该明白全局变量的一些属性。
    全局变量全局变量是定义在代码块之外({}花括号外面)的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时 其作用域很广,整个文件都有效甚至别的文件也能引用它。

    当使用static修饰全局变量时,限制了全局变量的作用域,使得全局变量只在本文件中有效。如果希望在其他文件中使用此变量,可以使用关键字extern实现。具体的实现方式可以看后面extern关键字部分。

  • 疑问,下面这个问题我没有弄明白,如果有人知道为什么,希望能告诉我
    为什么使用static修饰的全局变量仍可以在其他文件中调用?

    在.h文件中。定义全局变量,编译器会报错。
    同样在.h文件中,使用static修饰全局变量,编译器则不再报错。但是,这个全局变量却可以在其他文件中 调用,正常的话,使用static后不是应该只在本文件中才能使用吗?而且在其他文件中调用的变量时,其实是实例出了一个新的变量。

const关键字

  • const关键字用于修饰变量,作用是限定变量的读写权限,const修饰的变量不可变
  • 使用const关键字修饰变量时。const所处的位置不同,所达到的效果不同。总的来说是:const右边的值不可变
  • const修饰指针变量
static NSString const * str = @"东临碣石,以观沧海";
static const NSString * str = @"东临碣石,以观沧海";

以上两种方式的作用是一样的,字符串str的值(东临碣石,以观沧海)是可以被修改的,而指向str的值的指针是不能被修改的。

  • const修饰变量
static NSString * const str = @"东临碣石,以观沧海";

上面定义的变量str的值(东临碣石,以观沧海)是不可变的。

extern关键字

  • extern作用:用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
  • extern原理:先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。

可以在.m文件中定义全局变量

NSString * const nameKey = @"name";

然后再其他任何地方获取这个全局变量

extern NSString * const nameKey;

注意:我们这里没有使用static修饰

相关文章

网友评论

    本文标题:OC中static、const、extern关键字理解

    本文链接:https://www.haomeiwen.com/subject/bkbzdxtx.html