Objective-C static定義常量和變量總結(jié)

1. .m 文件里定義static 常量

// .m

static const int kConstant = xxx;

@implementation ...

@end

  • 該文件里全局可見 (準(zhǔn)確說應(yīng)該是compilation unit,而不是文件)
  • 外部文件不能通過extern引用

2. .m 文件里定義static 變量

// .m

static int intVar = xxx;

@implementation ...

@end

// .h
//實(shí)現(xiàn)類似類變量的機(jī)制
+ (int)intVar;
+ (void)setIntVar:(int)intVar;

  • OC里沒有類變量的概念,但通過靜態(tài)的全局變量,可以實(shí)現(xiàn)類似類變量的東西
    • 因?yàn)橐话闱闆r下,OC里的類以文件為單位,劃分。通過給類添加,get 和 set的類方法,去實(shí)際操作這個(gè)全局變量,就可以實(shí)現(xiàn)類似類變量的機(jī)制。
  • 外部文件不能通過extern引用

3. .h 里定義static 常量

// .h

static const int kConstatnt = 1;

Variable declarations in header files - static or not?

這里static,意味著,每一個(gè)包含這個(gè)頭文件的源文件里,會(huì)包含一個(gè)這個(gè)常量的拷貝,但與此同時(shí),鏈接時(shí),并不會(huì)出現(xiàn)符號(hào)沖定義的錯(cuò)誤。

  • 外部文件,可以通過引用該頭文件,使用這個(gè)全局常量,但這里獲得的是該常量的一份,拷貝,因?yàn)槌A坎⒉荒苄薷?,所以獲取的是拷貝,也沒有太多問題
  • 如果這里,去掉這個(gè)static,外部文件引用這個(gè)頭文件,就會(huì)出現(xiàn)符號(hào)重定義的鏈接錯(cuò)誤
  • 但是這種實(shí)現(xiàn)全局常量的方式不太好

4. .h 里定義static 變量

// .h

static int intVar;


  • 這里同在.h里定義static 常量一樣,每一個(gè)引用該頭文件的源文件,獲取到的是這個(gè)變量的一份拷貝,也就是說你在不同的文件里,修改這個(gè)變量,都是修改當(dāng)前文件里的一份拷貝,只會(huì)在當(dāng)前這個(gè)文件范圍里生效
// a.h 

static int a = 0;  //定義了一個(gè)全局變量
 
@interface A: NSObject

+ (void)printA; //打印a的值

@end

// a.m

@implementation 

+ (void)printA {
    NSLog("%d",a);
}

@end


// b.h

@interface B: NSObject

+ (void)printA; //打印a的值

@end


// b.m 
#import "a.h" //引入了全局變量 a

@implementation 

+ (void)printA {
    a ++;
    NSLog("%d",a);
}

@end

// main.m

[A printA];  // 1 
[B printA];  // 2
[A printA];  // 1
[B printA];  // 3
[A printA];  // 1
[B printA];  // 4


  • 所以這種方式,定義的變量,并不是真正的全局變量。

5.更優(yōu)雅的方式,定義全局變量和全局常量

  • .m文件里,定義全局變量,和全局常量,不用static修飾
  • .h文件里,用extern聲明這些全局變量和全局
  • 其他文件引用這個(gè).h來使用相應(yīng)的常量和變量。
// .m
int a;

// .h
extern int a;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容