場(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)用。