修飾符static extern const的注意點

static

1>修飾全局變量

*全局變量的做用域僅限於當前文件內部,防止重命名,其餘文件沒法訪問框架

2>修飾局部變量

***局部變量的生命週期,與全局變量相似函數

*可是不能改變做用域spa

*能保證局部變量永遠只初始化一次指針

- (void)vieDidLoad{
     for (int i = 0; i < 5; i++) {
       [self test];
   }
}

- (void)test{
   static int a = 1;
    a++;
    NSLog(@"%d",a);
}
//NSLog結果爲 2,3,4,5,6
- (void)test1{
    int a = 1;
    a++;
    NSLog(@"%d",a);
}
//NSLog結果爲 2,2,2,2,2  由於每次調用test1,a都從新初始化

3>static在c語言中

static在c裏面能夠用來修飾變量,也能夠用來修飾函數。
先看用來修飾變量的時候。變量在c裏面可分爲存在全局數據區、棧和堆裏。其
int a ;
int main()
{
    int b ; 
    int c* = (int *)malloc(sizeof(int));
}

    a是全局變量,b是棧變量,c是堆變量。
    static對全局變量的修飾,能夠認爲是限制了只能是本文件引用此變量。有的程序是由好多.c文件構成。彼此能夠互相引用變量,但加入static修飾以後,只能被本文件中函數引用此變量。
static對棧變量的修飾,能夠認爲棧變量的生命週期延長到程序執行結束時。通常來講,棧變量的生命週期由OS管理,在退棧的過程當中,棧變量的生命也就結束了。但加入static修飾以後,變量已經再也不存儲在棧中,而是和全局變量一塊兒存儲。同時,離開定義它的函數後不能使用,但如再次調用定義它的函數時,它又可繼續使用, 並且保存了前次被調用後留下的值。
static對函數的修飾與對全局變量的修飾類似,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用。
code


extern

1,訪問其餘文件的全局變量

*但不能訪問前綴有static的全局變量orm

2,可以讓屬性被其餘文件引用

    extern NSString *const age = @"12";生命週期


const

1.修飾變量

  基礎用法:  const int num = 40; 限定num不可變內存

  其餘用法:含有指針作用域

int * const p3 = &age;   //這種寫法能夠歸類爲const在指針以後
//修改p3指針指向的內存地址(本來指向age的內存地址,如今指向常量40的內存地址)
*p3 = 40;
/* ==========錯誤寫法============
 p3 = 30;

 由於const在*以後,因此它是修飾變量,變量不可變
 */

2.修飾指針  

int age = 20;

const int *p1 = &age;    //這兩種寫法都是同樣,能夠歸類爲const在指針以前
int const *p2 = &age;    //不能經過指針間接修改變量的值

int num = 30;
//簡單的變量賦值
p1 = &num;
p2 = &num;
/* ==========錯誤寫法============
   *p1 = 40;
   *p2 = 40;
    
    由於const在*以前,因此它是修飾指針,指針不可變
 */

3.注意事項

 1.const和define的值都是不可變。
 
 2.使用宏和const的好處是減小臨時內存。
   例如須要打印輸出2個20的操做,這個時候就有2份臨時內存。而打印2個define的,卻只會有1份
 
 3.define宏是編譯前就處理,而const是用到那個變量才編譯。
 
 4.const只能修飾常量,字面量的值,不能含有方法。而宏就能夠修飾函數方法
 
 5.當某個文件定義了全局變量的時候int *const Appkey = 20; 其餘m文件不能再次定義相同的全局變量,不然會出現連接錯誤。因此只能使用引用extern訪問外部全局變量extern int *const Appkey;但如此的話太過麻煩。由於某個文件時候就要寫重複代碼extern引用.
    解決辦法:
 新建一個cocoa class.在.m文件中 只保留#import <Foundation/Foundation.h>(由於用到NSString等這些須要用到這個框架)和const語句.在h文件中,也是隻保留#import <Foundation/Foundation.h>和extern語句,如此其餘類須要用到的時候,只須要引用該.h文件便可,和不須要import任何.h,包括本身的.
it

 例子:在const.h中:
    
    #import <Foundation/Foundation.h>
 
    extern NSString * const HWAppKey;
 
 在const.m中:
 
    #import <Foundation/Foundation.h>
 
    NSString * const HWAppKey = @"3235932662";

6.咱們應該多使用const,少使用宏,由於蘋果官方都大量使用了const來代替define

相關文章
相關標籤/搜索