iOS中的static const extern關鍵字

OneAlon發表於2017-12-19

在iOS開發中會經常使用到static const extern3個關鍵字, 一直對這3個關鍵字很模糊, 這裡總結一下, 做一個筆記.

一.const關鍵字

const常被用來修飾字串常量, 其作用和巨集類似.

巨集定義是預編譯指令, 在編譯之前處理, 巨集不做檢查不會報編譯錯誤, 只是簡單的替換. const會編譯階段, 會做編譯檢查報編譯錯誤.

巨集可以用來定義一些函式和方法, 而const只能用來定義變數常量. 在專案中大量使用巨集定義, 會使專案的編譯時長大大增加. 在本公司的這個專案中(信用管家APP)大量使用了巨集定義, 編譯時間3分鐘之久, 真是不能忍.

NSString * const a = @"123";
複製程式碼

a的值是無法修改的.

二.static關鍵字

static關鍵字用來修飾變數的作用域. static修飾的變數只會分配一份記憶體.

static修飾區域性變數, 在上一次修改的基礎上進行修改

-(void)staticDemo1
{
    static int a1;
    a1++;
    NSLog(@"%zd", a1);
}
複製程式碼

無論呼叫幾次方法, a1的記憶體只有一份, 多次被呼叫時a1是在原來的基礎上修改的. 輸出結果為 1 2 3

static修飾全域性變數, 在當前檔案中可用, 在不同函式中呼叫修改, 會在上一個函式的基礎上修改

static int a2 = 3;

- (void)viewDidLoad {
    [super viewDidLoad];
    [self staticDemo2];
    [self staticDemo3];
    [self staticDemo2];
    [self staticDemo3];
}

-(void)staticDemo2
{
    a2++;
    NSLog(@"%zd", a2);
}

-(void)staticDemo3
{
    a2++;
    NSLog(@"%zd", a2);
}
複製程式碼

結果: 4 5 6 7

靜態全域性變數和非靜態全域性變數的區別: static限制了變數的作用域為當前檔案, 其他檔案可以定義一個相同的static變數, 如果沒有static修飾, 在其他檔案中定義了相同名稱的全域性變數, 會報錯.

三.extern關鍵字

只能用來獲取全域性變數的值, 不能用於定義變數

四.混搭使用

static和const

static NSString * const name = @"OneAlon";
複製程式碼

extern和const, 在多個檔案中經常使用的字串常量, 通常建立一個GlobeConst檔案用於管理全域性變數, 統一管理.

@interface GlobeConst : NSObject

extern NSString * const nameKey;

@end

------------------------------------------

@implementation GlobeConst

NSString * const nameKey = @"OneAlon";

@end
複製程式碼

相關文章