iOS中的一些修饰符、关键字

Static

修饰的局部变量:让局部变量永远只初始化一次,一份内存,生命周期已经跟全局变量类似了,只是作用域不变。
修饰全局变量:使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。iOS中在一个文件声明的全局变量,工程的其他文件也是能访问的,但是我又不想让其他文件访问,这时就可以用static修饰它了,比较典型的是使用GCD一次性函数创建的单例,全局变量基本上都会用static修饰。
修饰函数:static修饰函数时,被修饰的函数被称为静态函数,使得外部文件无法访问这个函数,仅本文件可以访问。这个在oc语言开发中几乎很少用,c语言倒是能看到一些影子,所以不详细探讨。

extern

这个单词翻译过来是“外面的、外部的”。顾名思义,它的作用是声明外部全局变量。这里需要特别注意extern只能声明,不能用于实现。在开发中,我们通常会单独抽一个类来管理一些全局的变量或常量,下面来看看逼格比较高的一种做法:我们可以在.h文件中extern声明一些全局的常量
//声明一些全局常量extern NSString * const name;
extern NSInteger const count;
然后在.m文件中去实现
//实现NSString * const name = 王五;NSInteger const count = 3;这样,只要导入头文件,就可以全局的使用定义的变量或常量。

const

1.const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
2.被const修饰的变量是只读的。(变量变成常量)
3.基本使用

- (void)viewDidLoad {
    [super viewDidLoad];

    // 定义变量
    int a = 1;

    // 允许修改值
    a = 20;

    // const两种用法
    // const:修饰基本变量p
    // 这两种写法是一样的,const只修饰右边的基本变量b
    const int b = 20; // b:只读变量
    int const b = 20; // b:只读变量

    // 不允许修改值
    b = 1;

    // const:修饰指针变量*p,带*的变量,就是指针变量.
    // 定义一个指向int类型的指针变量,指向a的地址
    int *p = &a;

    int c = 10;

    p = &c;

    // 允许修改p指向的地址,
    // 允许修改p访问内存空间的值
    *p = 20;

    // const修饰指针变量访问的内存空间,修饰的是右边*p1,
    // 两种方式一样
    const int *p1; // *p1:常量 p1:变量
    int const *p1; // *p1:常量 p1:变量

    // const修饰指针变量p1
    int * const p1; // *p1:变量 p1:常量


    // 第一个const修饰*p1 第二个const修饰 p1
    // 两种方式一样
    const int * const p1; // *p1:常量 p1:常量

    int const * const p1;  // *p1:常量 p1:常量
}

使用static const修饰变量和宏定义的比较

相同点
都不能再被修改
一处修改,其它都改了
不同点
static const修饰变量只有一份内存
宏定义,只是简单的替换,每次使用都需要创建一份内存
结论
使用static const修饰更加高效,在同一个文件内可以使用static const取代#define


// static const修饰变量只有一份内存
static const CGFloat ZMJRed = 0.4;

// 宏定义,只是用0.4替换ZMJRed,每次使用都需要创建一份内存
#define ZMJRed 0.4

你可能感兴趣的:(iOS中的一些修饰符、关键字)