插圖.jpg
-
const
,static
,extern
幾個關鍵字,在它們的概念和用法上一直有點模糊,整理一下, 以便日后查閱。
1、const
- 作用
1、
const
僅僅用來修飾它右側的變量
2、 被const
修飾的變量是只讀的
注: 這就是為什么推薦使用const來替代宏定義, 宏定義不會報錯, 并且是可變的
- 常量區分和簡單使用
// 定義一個全局只讀常量。全局常量:不管你定義在任何文件夾,外部都能訪問
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區別)
const
為常量值,define
為字符串替換。
-
const
在編譯階段使用;define
在預編譯階段使用。 -
const
有數據類型,做安全檢查;define
無類型,不做安全檢查。 -
const
可以調試;define
不能調試。 -
const
占用一份內存;define
不占用內存,但是會多處進行字符串替換
以上幾點可概括為:
宏
:只是在預處理器里進行文本替換,沒有類型,不做任何類型檢查,編譯器可以對相同的字符串進行優化。
常量
:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,可以根據const修飾的位置設定能否修改,在編譯階段會執行類型檢查。
變量
:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,可以被修改,在編譯階段會執行類型檢查。
宏的好處
: 宏能定義一些函數、方法。 const不能。
宏的壞處
: 使用大量宏,容易造成編譯時間久,每次都需要重新替換。
參考資料
2、static和extern使用
static作用
- 修飾局部變量:
1.延長局部變量的生命周期, 程序結束才會銷毀。
2.局部變量只會生成一份內存, 只會初始化一次。
3.改變局部變量的作用域。(默認情況下全局變量的作用域是整個程序->可以通過extern來引用
, 被static修飾后僅限于當前文件來引用, 其他文件不能通過extern來引用) - 修飾全局變量
1.只能在本文件中訪問, 修改全局變量的作用域,生命周期不會改
2.避免重復定義全局變量
extern作用
- 只是用來獲取全局變量(包括全局靜態變量)的值,不能用于定義變量
extern工作原理
- 先在當前文件查找有沒有全局變量,沒有找到,才會去其他文件查找。
-
簡單舉例
-
全局變量
main函數中調用People類
People類中通過extern關鍵字引用Car中的全局變量
在Car類中定義一個全局變量
-
-
在全局變量前面添加Static關鍵字后
項目報錯,提示"_carPrice"為定義
// 全局變量:只有一份內存,所有文件共享,與extern聯合使用。
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);
}