iOS常用關鍵字static、const、extern、define

jerseycafe發表於2018-10-06

const

常量: 共享一塊記憶體空間,就算專案中N處用到,也不會分配N塊記憶體空間,可以被修改,在編譯階段會執行型別檢查.

  • 全域性常量

包括在 .h .m 檔案除非 ****@implementation**** 作用域內宣告的, 都屬於全域性常量, 都可能由外部進行訪問。

外部檔案訪問時需要 使用關鍵字 ****extern**** 並且指明常量宣告的型別來使用, 否則編譯器預設以 int 型別來處理。應該是與執行時有關。

  • 區域性常量

在 .m ****@implementation**** 內 方法實現內進行宣告, 只作用於

主要用於修飾 C 或 OC 資料型別, 使宣告的變數定義為常量。

三種修飾寫法不同作用.

  • const NSString * name = @”Jersey”;

使 *name 指標地址不可變, 實際指向內容不受影響, 修改指標地址編譯器報錯。

  • NSString const * name = @”Jersey”;

同上面寫法一致.

  • NSString * const name = @”Jersey”;

使 *name 指標指向內容不可變, 指標地址不受影響, 修改內容則編譯報錯。

總結 const 修飾其後面內容。

static

主要用於修飾變數或常量, 使其成為靜態變數或常量,延長其生命週期, 可用於修飾區域性變數和全域性變數。 使用其來修飾的資料型別使其變為靜態型別。

  • 靜態型別
  1. 在全域性變數前加static,全域性變數就被定義成為一個全域性靜態變數(全域性變數和靜態全域性變數的生命週期是一樣的,都是在堆中的靜態區,在整個工程執行期間內一直存在) 特點如下:

1)儲存區:靜態儲存區沒變(靜態儲存區在整個程式執行期間都存在);

2)作用域:全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。非靜態全域性 變數的作用域是整個源程式(多個原始檔可以共同使用);

而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。

好處:

不會被其他檔案所訪問,修改;

其他檔案中可以使用相同名字的變數,不會發生衝突。

作者:Peak_One

連結:https://www.jianshu.com/p/3fa703e80720

來源:簡書

簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

  • 修飾區域性變數
  1. 延長區域性變數的生命週期,程式結束才會銷燬。

  2. 區域性變數只會生成一份記憶體,只會初始化一次。

  3. 雖然出了宣告的作用域,並且其未銷燬,但是並無法進行訪問。

  4. 儲存區域由 棧 轉移到 靜態儲存區。

  • 修飾全域性變數
  1. 改變其作用域,只能在當前檔案下訪問,其他檔案不可見。

  2. 其他檔案如果宣告同名則不會報錯,也不會對此全域性變數有影響。

  • 修飾函式

類似修飾變數的作用。

extern

主要有三種用法

  • 使用其來宣告供外部使用。(這裡為什麼還需要特意使用其來新增宣告, 必須要引用 .h 才可以使用, 因為在 .h @interface @end 作用域內或者外, 宣告都會編譯報錯, 系統預設其為 全域性的, 所以我們必須還要使用 extern 關鍵字修飾)

  • 使用其來宣告引用外部變數等。

一般使用都是搭配 const 來使用.

在 .h 檔案 使用 extern 修飾如:

extern const NSString * name;

.m 實現

const NSString * name = @”jersey”;

實現必須遵守宣告格式。 型別 + 變數名;

extern NSString* const name;

NSString* const name = @”jersey”;

extern const NSString* name;

NSString* name = @”jersey”; // 不知道為什麼這種格式沒報錯.

define

  • 簡介:

直接借鑑大神:
只是在前處理器裡進行文字替換,沒有型別,不做任何型別檢查,編譯器可以對相同的字串進行優化。只儲存一份到 .rodata 段。甚至有相同字尾的字串也可以優化,你可以用GCC 編譯測試,”Hello world” 與 “world” 兩個字串,只儲存前面一個。取的時候只需要給前面和中間的地址,如果是整形、浮點型會有多份拷貝,但這些數寫在指令中。佔的只是程式碼段而已,大量用巨集會導致二進位制檔案變大。

作者:漢斯哈哈哈

連結:https://www.jianshu.com/p/f83335e036b5

來源:簡書

簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

  • define 與 const 區別:

巨集定義是在預編譯期間處理, 在使用時系統直接進行的方法替換, 靜態變數等則是在編譯期間進行的。

蘋果推薦我們在開發中儘量使用常量。

巨集定義不會系統不會做編譯檢查, 所以型別錯誤也能通過編譯, const 則會做編譯檢查。

能顯式的宣告資料型別, 並且不會出現自己定義的巨集被其他人員更換,導致出現難以排查的 Bug。

不過巨集不僅能對資料型別進行定義, 還能對 函式, 結構體, 方法等進行定義 相對比起常量來說作用會更多一些。

在實際開發中, 對於能使用常量定義完成的, 儘量使用常量能實現, 而不要考慮使用 巨集。

參考:

iOS 巨集(define)與常量(const)的正確使用

【如何正確使用const,static,extern】|那些人追的乾貨

OC中關鍵字extern、static、const探究

希望此篇文章對您有所幫助,如有不對的地方,希望大家能留言指出糾正。謝謝!!!!!

學習的路上,與君共勉!!!


相關文章