ios extern,static,const关键字

1.extern

外部变量,可置于变量或函数前,作用域是整个项目

注意:extern只能声明,不能用于实现。


    #import <UIKit/UIKit.h>  
    @interface Data :NSObject  
    extern NSString *const  name;  
    @end  
      
    #import "Data.h"  
    @implentment Data  
    NSString *const  name=@"洋洋";  
    @end  

    #import <UIKit/UIKit.h>  
    @interface ViewController :UIViewController  
    @end  
      
    #import "ViewController.h"  
    @implementation ViewController  
    -(void)viewDidLoad  
    {  
         NSLog(@"%@",name);  
    }  
    @end  

2.static

内部变量(静态变量)

a.修饰全局变量,作用域仅限于当前文件内部
作用:static定义的全局变量,extern引用也获取不到其值
b.修饰局部变量
作用:某个函数调用频率比较高并且某个变量值固定不变可以使用
保证局部变量永远只初始化一次,直到程序销毁时才释放,即为该变量分配的空间在整个程序的执行期内都始终存在


    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event  
    {  
        int i=0;  
        i++;  
        NSLog(@"%d",i);  
    } 

2017-02-07 15:41:35.415 WeChat[3107:167112] 1
2017-02-07 15:41:35.909 WeChat[3107:167112] 1
2017-02-07 15:41:36.317 WeChat[3107:167112] 1
2017-02-07 15:41:36.549 WeChat[3107:167112] 1
从输出日志中我们可以看到i一直等于1,因为每次点击进入这个方法就会重新初始化一个全新的变量i = 0,加了一次后值变为1,然后打印出结果为1,出了这个方法后局部变量i就被释放回收,所以每次打印出来的结果都为1。

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event  
    {  
        static int i=0;  
        i++;  
        NSLog(@"%d",i);  
    }  

2017-02-07 15:42:39.754 WeChat[3122:168278] 1

2017-02-07 15:42:40.360 WeChat[3122:168278] 2
2017-02-07 15:42:40.808 WeChat[3122:168278] 3
2017-02-07 15:42:41.208 WeChat[3122:168278] 4

上面日志中可以看到i的值一直在自增,这就是关键字static修饰的局部变量的作用,让局部变量永远只初始化一次,一份内存,生命周期已经跟全局变量类似了,只是作用域不变。

3.const

a.const用来修饰右边的基本变量或指针变量
b.被修饰的变量只读,不能被修改

int const *p                   //*p只读,p变量

int *const p                   //p只读,*p变量

const int *p                   //*p和p都只读

int const *const p         //*p和p都只读

const右边是谁,则谁就不可变

猜你喜欢

转载自blog.csdn.net/yf_forever/article/details/55211242