修饰符static extern const的注意点

static

1>修饰全局变量

*全局变量的做用域仅限于当前文件内部,防止重命名,其余文件没法访问框架

2>修饰局部变量

***局部变量的生命周期,与全局变量相似函数

*可是不能改变做用域spa

*能保证局部变量永远只初始化一次指针

- (void)vieDidLoad{
     for (int i = 0; i < 5; i++) {
       [self test];
   }
}

- (void)test{
   static int a = 1;
    a++;
    NSLog(@"%d",a);
}
//NSLog结果为 2,3,4,5,6
- (void)test1{
    int a = 1;
    a++;
    NSLog(@"%d",a);
}
//NSLog结果为 2,2,2,2,2  由于每次调用test1,a都从新初始化

3>static在c语言中

static在c里面能够用来修饰变量,也能够用来修饰函数。
先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其
int a ;
int main()
{
    int b ; 
    int c* = (int *)malloc(sizeof(int));
}

    a是全局变量,b是栈变量,c是堆变量。
    static对全局变量的修饰,能够认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此能够互相引用变量,但加入static修饰以后,只能被本文件中函数引用此变量。
static对栈变量的修饰,能够认为栈变量的生命周期延长到程序执行结束时。通常来讲,栈变量的生命周期由OS管理,在退栈的过程当中,栈变量的生命也就结束了。但加入static修饰以后,变量已经再也不存储在栈中,而是和全局变量一块儿存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 并且保存了前次被调用后留下的值。
static对函数的修饰与对全局变量的修饰类似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
code


extern

1,访问其余文件的全局变量

*但不能访问前缀有static的全局变量orm

2,可以让属性被其余文件引用

    extern NSString *const age = @"12";生命周期


const

1.修饰变量

  基础用法:  const int num = 40; 限定num不可变内存

  其余用法:含有指针作用域

int * const p3 = &age;   //这种写法能够归类为const在指针以后
//修改p3指针指向的内存地址(本来指向age的内存地址,如今指向常量40的内存地址)
*p3 = 40;
/* ==========错误写法============
 p3 = 30;

 由于const在*以后,因此它是修饰变量,变量不可变
 */

2.修饰指针  

int age = 20;

const int *p1 = &age;    //这两种写法都是同样,能够归类为const在指针以前
int const *p2 = &age;    //不能经过指针间接修改变量的值

int num = 30;
//简单的变量赋值
p1 = &num;
p2 = &num;
/* ==========错误写法============
   *p1 = 40;
   *p2 = 40;
    
    由于const在*以前,因此它是修饰指针,指针不可变
 */

3.注意事项

 1.const和define的值都是不可变。
 
 2.使用宏和const的好处是减小临时内存。
   例如须要打印输出2个20的操做,这个时候就有2份临时内存。而打印2个define的,却只会有1份
 
 3.define宏是编译前就处理,而const是用到那个变量才编译。
 
 4.const只能修饰常量,字面量的值,不能含有方法。而宏就能够修饰函数方法
 
 5.当某个文件定义了全局变量的时候int *const Appkey = 20; 其余m文件不能再次定义相同的全局变量,不然会出现连接错误。因此只能使用引用extern访问外部全局变量extern int *const Appkey;但如此的话太过麻烦。由于某个文件时候就要写重复代码extern引用.
    解决办法:
 新建一个cocoa class.在.m文件中 只保留#import <Foundation/Foundation.h>(由于用到NSString等这些须要用到这个框架)和const语句.在h文件中,也是只保留#import <Foundation/Foundation.h>和extern语句,如此其余类须要用到的时候,只须要引用该.h文件便可,和不须要import任何.h,包括本身的.
it

 例子:在const.h中:
    
    #import <Foundation/Foundation.h>
 
    extern NSString * const HWAppKey;
 
 在const.m中:
 
    #import <Foundation/Foundation.h>
 
    NSString * const HWAppKey = @"3235932662";

6.咱们应该多使用const,少使用宏,由于苹果官方都大量使用了const来代替define

相关文章
相关标签/搜索