前言:說實在的,基礎是最重要的,而我是一個經常忘記基礎的人,所以,每次發現自己忘了或者不了解就會重新回去看一下基礎,痛并快樂著,誰叫我蠢呢?人蠢就應該多讀書。廢話不多說,下面說說對這幾個蛋疼的關鍵詞的理解,僅一家之言,不服可以來辯。??
1.static
static就是靜態變量,內存只被分配一次,存放在靜態變量區。
(1)不僅可以修飾變量,還可以修飾函數
static void testStaticVar() {
static NSInteger count = 5;
count++;
NSLog(@"count: %ld", count);
}
(2)在調用過程中其值維持不變
static void testStaticVar() {
static NSInteger count = 5;
count++;
NSLog(@"count: %ld\n", count);
NSInteger count2 = 5;
count2++;
NSLog(@"count2: %ld\n", count2);
}
for (NSInteger index = 0; index < 5; index++) {
testStaticVar();
}
//輸出結果
//靜態變量count的數值一直往上加,局部變量count2的數值一直為6
2017-02-27 14:55:59.669256 BasicTest[6090:433023] count: 6
2017-02-27 14:55:59.670135 BasicTest[6090:433023] count2: 6
2017-02-27 14:55:59.670185 BasicTest[6090:433023] count: 7
2017-02-27 14:55:59.670198 BasicTest[6090:433023] count2: 6
2017-02-27 14:55:59.670207 BasicTest[6090:433023] count: 8
2017-02-27 14:55:59.670238 BasicTest[6090:433023] count2: 6
2017-02-27 14:55:59.670253 BasicTest[6090:433023] count: 9
2017-02-27 14:55:59.670288 BasicTest[6090:433023] count2: 6
2017-02-27 14:55:59.670298 BasicTest[6090:433023] count: 10
2017-02-27 14:55:59.670306 BasicTest[6090:433023] count2: 6
(3)限定作用域
\\在模塊內聲明的變量可以被模塊內所有函數訪問,但不能被模塊外其他函數訪問
\\如果是非靜態全局變量,可以加上extern關鍵字暴露出來,模塊外也能訪問
2.const
1.只讀屬性,修飾的右邊變量只讀,不能修改
2.編譯期間處理,會做錯誤檢查,不能定義函數,只能修飾變量
3.作用域不限于本文件,外部也可以訪問
4.可以節省空間,避免不必要的內存分配(const定義常量只給出對應的內存地址)
5.提高了效率(編譯器通常不為普通const常量分配儲存空間,而是將它們保存在符號表,成為一個編譯常量,沒有存取操作,效率高)
Tips:const修飾的是右邊變量,把類型去掉就是const的修飾變量
const int a;
int const a;
//去掉類型const修飾的都是a,所以以上的寫法效果一樣
int *const p; //指針p不能改變
const int *p; //*p不能改變
const int *const p; //指針p不能改變,指針指向的內容*p也不能改變
3.define
1.編譯前處理
2.直接替換參數,不做類型錯誤檢查
3.可以定義常量和函數
#define P_I 3.14
#define sum(x, y) ((x)*(y))
CGFloat pi = P_I;
NSInteger sum = sum(3, 4);
NSLog(@"PI: %lf----sum(3, 4) = %ld", pi, sum);
//輸出結果
2017-02-27 15:23:04.352012 BasicTest[6174:445944] PI: 3.140000----sum(3, 4) = 12
4.總結
雖然是一些基礎,但是可能以后會用上,誰知道呢???