天天看點

OC關鍵字const

常量非常量主要分析點在于堆記憶體區的讀寫特性。

底層clang編譯器編譯機制作用下,不推薦将字元串常量抽像成宏符号。

宏符号 與 字元串常量 比較:

1.編譯時刻:宏符号是預編譯(正式編譯之前先替換處理),const是編譯階段檢查。

2.編譯階段檢查:宏符号不做檢查,不會報宏符号替換的編譯錯誤,隻是單純的替換,const會進行編譯檢查,會在編譯階段報文法錯誤。

3.宏好處:某些函數,方法可以通過宏符号替換。 const常量堆記憶體區不能代替函數、方法。

4.宏壞處:使用大量宏符号,每次都需要大量的預編譯時間作重新替換,使得整個編譯過程耗時更久。

const介紹:

const關鍵字僅用于修飾定義聲明指令中右邊的聲明字段名

  • (void)constUsingStyle {

    //字段名稱棧器皿持有的堆記憶體區預設模式可讀可寫(遠端通路讀取/遠端通路寫入修改(二次指派))

    //基本資料類型字段名直接在棧層級寫入修改

    int a = 1;

    a = 20;

    //關鍵字const用法:1.修飾基本類型字段名稱棧器皿(隻讀/聲明時初值) 2.
               

    // const int b = 20;//隻讀特性(不支援遠端通路寫入修改(二次指派))

    // b = 1;

    //const:修飾*指針變量p,帶*的變量,就是指針變量.
      //基本資料類型直接聲明字段名(普通字段名稱)寫入内容;
      int const b = 20;//隻讀特性
      //基本資料類型補充*指針聲明出帶有基本資料類型*指針風格的指針型字段名
      //備注:基本資料類型直接聲明字段名不帶*标志(int const b的聲明效果和const int b的聲明效果一緻)
      int *p = &a;//*指針型字段名p寫入相應資料值的位址(p沒有采用const修飾,相應的記憶體可讀可寫)
      //執行個體對象類型*指針 聲明字段名持有相應的執行個體對象值
      NSString *nameStr = @"12345";//對象類*指針結構特征字段名nameStr持有相應的執行個體對象值
    
      int c = 10;
      p = &c;//*指針型字段名p允許修改位址指向
      //*指針型字段名p允許修改所通路的記憶體空間内的資料值
      *p = 30;//p和&c對應同一片記憶體區(一處修改另一處同樣跟着受影響)
      [SRSToast toastWithMessage:[NSString stringWithFormat:@"%d",c] displayType:5];
    
      NSMutableArray *listAry = [NSMutableArray arrayWithCapacity:3];
      [listAry addObject:@"1"];
      [listAry addObject:@"2"];
    
      //對象類型類*指針  聲明字段名(指派表達式指令:左邊字段名和右邊的表達式(右邊字段名)持有綁定同個堆記憶體區)
      NSMutableArray *ltAry = listAry;
      NSLog(@"listAry=%@|ltAry=%@",listAry,ltAry);
      [ltAry removeObject:@"1"];
      NSLog(@"listAry=%@|ltAry=%@",listAry,ltAry);
      ltAry = [NSMutableArray arrayWithArray:@[@"3",@"4",@"5",@"6"]];
      NSLog(@"listAry=%@|ltAry=%@",listAry,ltAry);
    
      //@"12345"/@"0000"開辟堆記憶體區
      NSString *name1 = @"12345";//指派同級或子類的執行個體對象值(多太機制),左邊name1字段名和右邊表達式隐式名持有同一片堆記憶體區假設0x6b3f
      NSString *name2 = name1;//指派指令操作後,name2字段名和name1字段名持有同一片堆記憶體區假設0x6b3f
      NSLog(@"name1=%@|name2=%@",name1,name2);
      //對象堆記憶體區的讀寫:可讀:對象字段名堆記憶體區區域中次級字段内容/對象字段名堆記憶體區本身整體字段内容讀取;可寫:對象字段名堆記憶體區區域中次級字段名内容寫入修改(對象堆記憶體區本身的寫入不支援整體,如果對象字段名本身整體建構執行指派指令效果是該對象字段名重新持有綁定全新的堆記憶體區)/
      name2 = @"0000";//name2字段名綁定全新的堆記憶體區0x6677
      NSLog(@"name1=%@|name2=%@",name1,name2);
      name2 = name1;//對象字段名name2本身整體建構執行指派指令,name2字段名綁定name1字段名的堆記憶體區(此時name2和name1具有同一片堆記憶體區0x6b3f)
      NSLog(@"name1=%@|name2=%@",name1,name2);
    
      //基本資料類型字段名直接在棧層級寫入修改
      int num1 = 1;//開辟棧區0x9900,直接棧區寫入修改資料内容值1
      int num2 = 2;//開辟棧區0x3647,直接棧區寫入修改資料内容值2
      NSLog(@"num1=%d|num2=%d",num1,num2);
      num1 = num2;//将num2對應棧區0x3647内直接資料内容值2的資料資訊(副本)值讀取出來寫入num1對應棧區0x9900内,操作結束後num1對應棧區0x9900内直接存儲資料值2,num2對應棧區0x3647内依舊直接存儲資料值2
      NSLog(@"num1=%d|num2=%d",num1,num2);
      num1 = 3;//将基本資料類型資料值3直接棧區寫入num1對應棧區0x9900内,操作結束後num1對應棧區0x9900内直接存儲資料值3,num2對應棧區0x3647内依舊直接存儲資料值2
      NSLog(@"num1=%d|num2=%d",num1,num2);
      //無論怎麼建構執行指令,num1,num2這2個基本資料類型字段名定義聲明時擁有着不同的棧區,永遠具有不同棧區
    
      int num3 = 5;
      const int *p1; //*p1:整體呈現常 量符号特性(隻讀取 結構值) p1:呈現變 量符号特性(可讀可寫 結構值)
      p1 = &num3;//資料型量符号num3的位址
      int num4 = *p1;
      int num5 = 7;
      p1 = &num5;
    
      int num6 = 9;
      int const *p2;//*p2:整體呈現常 量符号特性(隻讀取 結構值) p2:呈現變 量符号特性(可讀可寫 結構值)
      p2 = &num6;//基本資料類型*指針型字段名p2可寫入持有基本資料類型的量符号位址化位址值
      int num7 = *p2;
      int num8 = 110;
      p2 = &num8;
    
      //const直接修飾指針變量p3
      int * const p3; // *p3:呈現變 量符号特性(可讀可寫 結構值) p3:呈現常 量符号特性(隻讀取 結構值)
    
      const int * const p4; // *p4:呈現常 量符号特性(隻讀取 結構值) p4:呈現常 量符号特性(隻讀取 結構值)
      int const * const p5; // *p5:呈現常 量符号特性(隻讀取 結構值) p5:呈現常 量符号特性(隻讀取 結構值)
               

}

OC關鍵字const
OC關鍵字const
OC關鍵字const

繼續閱讀