程序內(nèi)存使用情況:
object-C可執(zhí)行的程序是由(可執(zhí)行)代碼锻全、初始化代碼和未初始化的程序數(shù)據(jù)眯杏、鏈接信息、重定位信息懒震、舉報(bào)數(shù)據(jù)和動態(tài)數(shù)據(jù)構(gòu)成罩息。
1、程序數(shù)據(jù)包括以靜態(tài)方式聲明的變量和程序常量(即在程序編譯時(shí)在代碼中設(shè)置的常數(shù))个扰。
2瓷炮、可執(zhí)行代碼、程序數(shù)據(jù)已經(jīng)鏈接與重定位信息會議靜態(tài)方式被分配內(nèi)存递宅,并在程序的聲明周期中一直存在娘香。
3、局部(自動)數(shù)據(jù)在語句中聲明并且僅在該語句塊中有效办龄,當(dāng)該語句塊執(zhí)行后局部數(shù)據(jù)不會繼續(xù)存在
{
int a=1;
NSLog(@"%d",a);
}
a為局部變量烘绽,只存在于這個(gè)語句塊中,執(zhí)行完語句將不會存在俐填。
自動數(shù)據(jù)被存儲在程序的棧中安接,程序棧通常是執(zhí)行程序、線程前舍得尺寸的內(nèi)存段英融。棧用于存儲局部變量和調(diào)用方式盏檐、函數(shù)上下文數(shù)據(jù)包括方法的輸入?yún)?shù)呀打、返回值,已經(jīng)調(diào)用完方法后繼續(xù)執(zhí)行程序的代碼地址糯笙。操作系統(tǒng)會自動管理哲學(xué)內(nèi)存贬丛,這些數(shù)據(jù)會獲得棧中的內(nèi)存,而且分配給這些書的內(nèi)存會在他們失效和被釋放给涕。
在運(yùn)行時(shí)中通過NSobject類的alloc方法創(chuàng)建的對象存儲在動態(tài)分配的內(nèi)存及堆內(nèi)存中豺憔。以動態(tài)方式創(chuàng)建對象就意味著需要進(jìn)行內(nèi)存管理,因?yàn)樵诙褍?nèi)存中創(chuàng)建的對象永遠(yuǎn)不會超出其作用范圍够庙。(這就是為什么誰創(chuàng)建誰release)恭应。
程序的棧尺寸(通常)是在程序啟動時(shí)確定的,會自動由系統(tǒng)管理耘眨。另一方面昼榛,OC中對象在程序執(zhí)行時(shí)動態(tài)創(chuàng)建的,不會自動由系統(tǒng)收回剔难,因此需要程序必須進(jìn)行內(nèi)存管理胆屿,以確保通過恰當(dāng)?shù)姆绞绞褂孟到y(tǒng)內(nèi)存,不進(jìn)行內(nèi)存管理或錯(cuò)誤內(nèi)存管理會導(dǎo)致以下結(jié)果:
內(nèi)存泄露:
如果程序沒有釋放不在使用的的對象就會出現(xiàn)該問題偶宫。如果程序誒呦使用為其分配的內(nèi)存非迹,就會浪費(fèi)內(nèi)存資源;如果系統(tǒng)機(jī)械為程序分配內(nèi)存并沒有是非這些內(nèi)存纯趋,程序最終會耗盡系統(tǒng)內(nèi)存憎兽。
懸掛指針:
如果程序釋放了仍在使用的對象(野指針),就會到賬該問題吵冒。如果將來的程序嘗試訪問這些對象就會出現(xiàn)程序錯(cuò)誤纯命。