
插圖.jpg
-
const,static,extern幾個關(guān)鍵字,在它們的概念和用法上一直有點模糊,整理一下, 以便日后查閱。
1、const
- 作用
1、
const僅僅用來修飾它右側(cè)的變量
2、 被const修飾的變量是只讀的
注: 這就是為什么推薦使用const來替代宏定義, 宏定義不會報錯, 并且是可變的
- 常量區(qū)分和簡單使用
// 定義一個全局只讀常量。全局常量:不管你定義在任何文件夾,外部都能訪問
1、#import"ViewControllerOne.h"
NSString *const tempString = @"Eugene_iOS";(同const NSString * tempStr = @"Eugene";)
2、#import"ViewControllerTwo.h"
extern NSString * globalStr ;
NSLog(@"==%@==", globalStr);
// 定義一個局部只讀常量。局部常量:用static修飾后,只能本文件訪問,不能提供外界訪問
static NSString *const Key = @"Eugene_iOS”;
- (void)viewDidLoad {
[super viewDidLoad];
//這里修改會報錯,tempString不能被修改
tempString = @"test";
}
- const修飾位置不同
// const:修飾基本變量
const int b = 20; // b:只讀變量
int const b = 20; // b:只讀變量
// 不允許修改值
b = 1;
//由此可見無論const在int的哪一邊,a和b都是只讀變量.
// const:修飾指針變量
int * const p1; // *p1:變量 p1:常量
const int *p1; // *p1:常量 p1:變量
int const *p1; // *p1:常量 p1:變量
const int * const p1; // *p1:常量 p1:常量
int const * const p1; // *p1:常量 p1:常量
補充 (const和define區(qū)別)
const為常量值,define為字符串替換。
-
const在編譯階段使用;define在預(yù)編譯階段使用。 -
const有數(shù)據(jù)類型,做安全檢查;define無類型,不做安全檢查。 -
const可以調(diào)試;define不能調(diào)試。 -
const占用一份內(nèi)存;define不占用內(nèi)存,但是會多處進行字符串替換
以上幾點可概括為:
宏:只是在預(yù)處理器里進行文本替換,沒有類型,不做任何類型檢查,編譯器可以對相同的字符串進行優(yōu)化。
常量:共享一塊內(nèi)存空間,就算項目中N處用到,也不會分配N塊內(nèi)存空間,可以根據(jù)const修飾的位置設(shè)定能否修改,在編譯階段會執(zhí)行類型檢查。
變量:共享一塊內(nèi)存空間,就算項目中N處用到,也不會分配N塊內(nèi)存空間,可以被修改,在編譯階段會執(zhí)行類型檢查。
宏的好處: 宏能定義一些函數(shù)、方法。 const不能。
宏的壞處: 使用大量宏,容易造成編譯時間久,每次都需要重新替換。
參考資料
2、static和extern使用
static作用
- 修飾局部變量:
1.延長局部變量的生命周期, 程序結(jié)束才會銷毀。
2.局部變量只會生成一份內(nèi)存, 只會初始化一次。
3.改變局部變量的作用域。(默認情況下全局變量的作用域是整個程序->可以通過extern來引用, 被static修飾后僅限于當(dāng)前文件來引用, 其他文件不能通過extern來引用) - 修飾全局變量
1.只能在本文件中訪問, 修改全局變量的作用域,生命周期不會改
2.避免重復(fù)定義全局變量
extern作用
- 只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量
extern工作原理- 先在當(dāng)前文件查找有沒有全局變量,沒有找到,才會去其他文件查找。
-
簡單舉例
-
全局變量
main函數(shù)中調(diào)用People類
People類中通過extern關(guān)鍵字引用Car中的全局變量
在Car類中定義一個全局變量
-
-
在全局變量前面添加Static關(guān)鍵字后
項目報錯,提示"_carPrice"為定義
// 全局變量:只有一份內(nèi)存,所有文件共享,與extern聯(lián)合使用。
int a = 20;
// static修飾全局變量
static int age = 20;
- (void)test {
// static修飾局部變量
static int age = 0;
age++;
NSLog(@"%d",age);
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self test];
[self test];
extern int age;
NSLog(@"%d",age);
}



