iOS中的static、const使用

static部分

static分兩種情況,修飾局部變量全局變量

  • 局部變量是存儲在棧區(qū)的,它的?命周期是整個代碼塊,作?域
    也是整個代碼塊,?旦出了這個代碼塊,存儲局部變量的這個棧
    內(nèi)存就會被回收,局部變量也就被銷毀了。
局部變量
  • ?static修飾局部變量時,這個靜態(tài)局部變量和全局變量、靜態(tài)全局變量?樣,是存儲在靜態(tài)存儲區(qū)。存儲在靜態(tài)存儲區(qū),所以這塊內(nèi)存直到程序結(jié)束才會銷毀。但是它只在聲明它的代碼塊可 見,所以其作?域還是聲明它的代碼塊。

靜態(tài)局部變量

static修飾全局變量

  • 當(dāng)全局變量沒有使?static修飾符時,其存儲在靜態(tài)存儲區(qū),直到程序結(jié)束才銷毀。也就是其作?域是整個源程序。我們可以使? extern關(guān)鍵字來引?這個全局變量。
  • 當(dāng)全局變量使?static修飾時,其?命周期沒有變,依舊是在程序結(jié)束時才銷毀。但是其作?只限于聲明它的這個?件,使?extern關(guān)鍵詞引?會報錯。

extern

為什么static修飾的變量只能在當(dāng)前?件使??
static修飾全局變量后,該變量符號在符號表中的 Bind 屬性變?yōu)閘ocal ,對于符號解析原則,當(dāng)遇到了?個local符合?即解析,并 不會繼續(xù)再去后續(xù)的其他源?件中對相應(yīng)的同名全局符號進?解 析綁定。 (代碼段?數(shù)據(jù)段?)
所以經(jīng) static 修飾后的全局變量在本?件的鏈接期時,當(dāng)這些全局符號被鏈接的時候會被?刻綁定到?件中相應(yīng)的符號。當(dāng)其他 源?件在鏈接的時候同樣看到local屬性的全局符號并不會對其綁 定。所以經(jīng)由 static 修飾后,全局變量只在當(dāng)前?件內(nèi)有效,不 會被鏈接到其它?件中。
dumplicate symbols 、Unde?ned symbols等錯誤提?都是鏈接器 在鏈接過程中發(fā)現(xiàn)的問題。

編譯時鏈接器做了什么?
1. Mach-O ?件??到有什么?
主要就是代碼和數(shù)據(jù):代碼是函數(shù)的定義;數(shù)據(jù)是全局變量的定 義,包括全局變量的初始值。不管是代碼還是數(shù)據(jù),它們的實例 都需要由符號將其關(guān)聯(lián)起來。
2. 鏈接器將多個Mach-O?件合并成?個
?個項???定會有多個?件,項?中?件之間的變量和接?函 數(shù)都是相互依賴的,所以這時我們就需要通過鏈接器將項?中? 成的多個 Mach-O ?件的符號和地址綁定起來。
沒有這個綁定過程的話,單個?件?成的 Mach-O ?件是?法正常運?起來的。因為,如果運?時碰到調(diào)?在其他?件中實現(xiàn)的函數(shù)的情況時,就會找不到這個調(diào)?函數(shù)的地址,從??法繼續(xù)
執(zhí)?。鏈接器在鏈接多個?標(biāo)?件的過程中,會創(chuàng)建?個符號表,?于記錄所有已定義的和所有未定義的符號。鏈接時如果出現(xiàn)相同符號,就會出現(xiàn)“l(fā)d: dumplicate symbols”的編譯錯誤信息;
如果在其他?標(biāo)?件?沒有找到符號,就會提?“Undefined symbols”的編譯錯誤信息。
3. 鏈接器對代碼主要做了哪?件事??

  • 去項??件?查找?標(biāo)代碼?件?沒有定義的變量。
  • 掃描項?中的不同?件,將所有符號定義和引?地址收集起
    來,并放到全局符號表中。
  • 計算合并后長度及位置,?成同類型的段進?合并,建?綁
    定。
  • 對項?中不同?件?的變量進?地址重定位。

總結(jié):

static修飾局部變量:將局部變量的本來分配在棧區(qū)改為分配
在靜態(tài)存儲區(qū),也就改變了局部變量的?命周期。
static修飾全局變量:全局變量本來是在整個源程序的所有?
件都可見,static修飾后,改為只在聲明的那個?件可見,即
修改了其作?域。

const部分

warning 解釋:指針變量賦值時,賦值語句左邊的指針?biāo)赶虻?br> 類型必須具有賦值語句右邊的類型所擁有的全部修飾符,才能正
常通過編譯,否則就會舍棄右邊變量多余的修飾符。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容