淺談iOS中的全局變量和static全局變量

場(chǎng)景:創(chuàng)建一個(gè)工具類(lèi),定義了一個(gè)靜態(tài)全局變量,如何釋放的問(wèn)題?

在C語(yǔ)言里面,靜態(tài)全局變量是存儲(chǔ)在全局內(nèi)存區(qū)(或是靜態(tài)存儲(chǔ)區(qū)),而且內(nèi)存的分配是在程序運(yùn)行前分配了,釋放是在程序運(yùn)行結(jié)束由系統(tǒng)自動(dòng)釋放,并不需要我們調(diào)用析構(gòu)方法。那么OC開(kāi)發(fā)中得全局靜態(tài)變量也是一致的。 所以我們沒(méi)有必要去管理我們的全局靜態(tài)變量,在delloc方法里面也不需要去釋放內(nèi)存,因?yàn)橄到y(tǒng)會(huì)自動(dòng)幫助我們釋放靜態(tài)變量。

內(nèi)存劃分:

  • 棧區(qū):內(nèi)存管理由系統(tǒng)控制,存儲(chǔ)的為非靜態(tài)的局部變量,例如:函數(shù)參數(shù),在函數(shù)中生命的對(duì)象的指針等。當(dāng)系統(tǒng)的棧區(qū)大小不夠分配時(shí), 系統(tǒng)會(huì)提示棧溢出。
  • 堆區(qū):內(nèi)存管理由程序控制,存儲(chǔ)的為malloc , new ,alloc出來(lái)的對(duì)象。
    如果程序沒(méi)有控制釋放,那么在程序結(jié)束時(shí),由系統(tǒng)釋放。但在程序運(yùn)行過(guò)程中,會(huì)出現(xiàn)內(nèi)存泄露、內(nèi)存溢出問(wèn)題。分配方式類(lèi)似于鏈表
  • 全局存儲(chǔ)區(qū)(靜態(tài)存儲(chǔ)區(qū)):全局變量、靜態(tài)變量會(huì)存儲(chǔ)在此區(qū)域。事實(shí)上全局變量也是靜態(tài)的,因此,也叫全局靜態(tài)存儲(chǔ)區(qū)。
    存儲(chǔ)方式: 初始化的全局變量跟靜態(tài)變量放在一片區(qū)域,未初始化的全局變量與靜態(tài)變量放在相鄰的另一片區(qū)域。
    程序結(jié)束后由系統(tǒng)釋放。
  • 文字常量區(qū):在程序中使用的常量存儲(chǔ)在此區(qū)域。程序結(jié)束后,由系統(tǒng)釋放。在程序中使用的常量,都會(huì)到文字常量區(qū)獲取。
  • 程序代碼區(qū):存放函數(shù)體的二進(jìn)制代碼。
    運(yùn)行程序就是執(zhí)行代碼,代碼要執(zhí)行就要加載進(jìn)內(nèi)存。

全局變量與全局靜態(tài)變量的區(qū)別:

  • (a)若程序由一個(gè)源文件構(gòu)成時(shí),全局變量與全局靜態(tài)變量沒(méi)有區(qū)別。
  • (b)若程序由多個(gè)源文件構(gòu)成時(shí),全局變量與全局靜態(tài)變量不同:全局靜態(tài)變量使得該變量成為定義該變量的源文件所獨(dú)享,即:全局靜態(tài)變量對(duì)組成該程序的其它源文件是無(wú)效的。
  • (c)具有外部鏈接的靜態(tài);可以在所有源文件里調(diào)用;除了本文件,其他文件可以通過(guò)extern的方式引用。

靜態(tài)全局變量的作用:

  • (a)不必?fù)?dān)心其它源文件使用相同變量名,彼此相互獨(dú)立。
  • (b)在某源文件中定義的靜態(tài)全局變量不能被其他源文件使用或修改。
  • (c) 只能在本文件中使用!具有內(nèi)部鏈接的靜態(tài);不允許在其他文件里調(diào)用。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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