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;