iOS常用關鍵字static、const、extern、define
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
主要用於修飾變數或常量, 使其成為靜態變數或常量,延長其生命週期, 可用於修飾區域性變數和全域性變數。 使用其來修飾的資料型別使其變為靜態型別。
- 靜態型別
- 在全域性變數前加static,全域性變數就被定義成為一個全域性靜態變數(全域性變數和靜態全域性變數的生命週期是一樣的,都是在堆中的靜態區,在整個工程執行期間內一直存在) 特點如下:
1)儲存區:靜態儲存區沒變(靜態儲存區在整個程式執行期間都存在);
2)作用域:全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。非靜態全域性 變數的作用域是整個源程式(多個原始檔可以共同使用);
而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。
好處:
不會被其他檔案所訪問,修改;
其他檔案中可以使用相同名字的變數,不會發生衝突。
作者:Peak_One
連結:https://www.jianshu.com/p/3fa703e80720
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。
- 修飾區域性變數
-
延長區域性變數的生命週期,程式結束才會銷燬。
-
區域性變數只會生成一份記憶體,只會初始化一次。
-
雖然出了宣告的作用域,並且其未銷燬,但是並無法進行訪問。
-
儲存區域由 棧 轉移到 靜態儲存區。
- 修飾全域性變數
-
改變其作用域,只能在當前檔案下訪問,其他檔案不可見。
-
其他檔案如果宣告同名則不會報錯,也不會對此全域性變數有影響。
- 修飾函式
類似修飾變數的作用。
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。
不過巨集不僅能對資料型別進行定義, 還能對 函式, 結構體, 方法等進行定義 相對比起常量來說作用會更多一些。
在實際開發中, 對於能使用常量定義完成的, 儘量使用常量能實現, 而不要考慮使用 巨集。
參考:
【如何正確使用const,static,extern】|那些人追的乾貨
希望此篇文章對您有所幫助,如有不對的地方,希望大家能留言指出糾正。謝謝!!!!!
學習的路上,與君共勉!!!
相關文章
- const、define 和 static 的區別
- 說說iOS中的常用的關鍵字static ,class(僅限Swift關鍵字)iOSSwift
- static關鍵字
- const關鍵字
- final關鍵字和static關鍵字
- let關鍵字和const關鍵字
- static關鍵字---"工具類"
- Java 的 static 關鍵字Java
- static關鍵字的作用
- 初識static關鍵字
- 嵌入式學習資源—說說使用static和const關鍵字
- extern和static使用
- const和define
- C語言之static關鍵字C語言
- java中的static關鍵字Java
- 【轉】C++ static關鍵字C++
- c/c++ const關鍵字C++
- 1_static關鍵字的使用
- java中static關鍵字的作用Java
- 第五章 static關鍵字
- 關鍵字const是什麼含意?
- C++中的 const 關鍵字C++
- PHP static 關鍵字和 self 關鍵字例項化的區別PHP
- C語言中static關鍵字詳解C語言
- java中的static和final關鍵字Java
- Java基礎——final和static關鍵字Java
- c語言static關鍵字的理解C語言
- static 和extern的區別
- 深入聊一下const關鍵字
- C語言 關鍵字const的作用 const int* 和int *const 的區別C語言
- PHP中static與yield關鍵字的思考PHP
- 物聯網學習教程—const關鍵字
- C語言中容易混淆的const關鍵字C語言
- #define巨集與列舉以及typedef關鍵字的區別
- final與static關鍵字的區別?(skycto JEEditor)
- Java基礎-static關鍵字和單例模式Java單例模式
- 深入理解Swift中static和class關鍵字Swift
- inline、const、mutable、this、staticinline