1,首先說一下什么是內(nèi)存.
內(nèi)存,簡單來說就是內(nèi)部存儲,通常說的話就是馮?諾依曼計算機(jī)結(jié)構(gòu),指出了計算機(jī)由運(yùn)算器,控制器,存儲器,輸入和輸出設(shè)備幾個部分組成,而且運(yùn)算器和控制器都合在一起,就是CPU,中央處理器,那么內(nèi)存就是CPU能直接讀寫訪問數(shù)據(jù)的地方,不過我們平時說的iphone內(nèi)存16G,64G,嚴(yán)格來說算外存,我們討論的不是這個,
那么內(nèi)存是用來存啥的呢? 指令 + 數(shù)據(jù),對于我們開發(fā)者來說,指令就是代碼邏輯,數(shù)據(jù)就是變量常量.
內(nèi)存有多大呢? 不大,現(xiàn)在主流的手機(jī)都是幾G,不過對于iphone來說都是1G.我們操作系統(tǒng)都是運(yùn)行在內(nèi)存之上的,1G好像不算大,所以為了支持多進(jìn)程(即同時多開幾個APP),也為了支持大程序,抽象的虛擬存儲概念誕生了.
2,什么是內(nèi)存管理?
剛才提到了蘋果手機(jī)的內(nèi)存就那么大,當(dāng)一個程序的內(nèi)存過大時,系統(tǒng)就會對程序產(chǎn)生內(nèi)存警告,Memory Waring,必要時會強(qiáng)制程序退出,這樣就會造成非常不好的用戶體驗,所以必須要對內(nèi)存進(jìn)行管理,也就是讓某些對象和 空間在不使用時被系統(tǒng)回收,防止造成內(nèi)存泄露而產(chǎn)生的內(nèi)存過大導(dǎo)致的app崩潰,
3,內(nèi)存管理的范圍(都誰需要被管理)
內(nèi)存管理的范圍: 任何繼承自NSObject的對象,對其他的基本數(shù)據(jù)類型不用管理
主要原因是:OC對象和其他基本數(shù)據(jù)類型在內(nèi)存中存儲的空間位置不一樣,對象存儲于堆中,需要程序員手動釋放,而其他的局部變量存放在棧中,由系統(tǒng)自動管理內(nèi)存,
4,如何進(jìn)行內(nèi)存管理?
每個OC對象都有一個引用計數(shù)retainCount,表示對象被引用的次數(shù),即現(xiàn)在有多少個東西在使用這個對象,當(dāng)一個對象剛被創(chuàng)建時,retainCount為 1,當(dāng)對象的retainCount為 0 時,對象被銷毀
相關(guān)概念:
內(nèi)存泄露:當(dāng)一個對象沒有指針指向時,這時他應(yīng)該被回收,如果你沒有被銷毀,這時就造成了內(nèi)存泄露.
野指針:訪問一塊壞的內(nèi)存,(已經(jīng)被回收的,不可用的)
僵尸對象:一個已經(jīng)被釋放的對象(可開啟僵尸對象檢測)
3,在日常開發(fā)中應(yīng)該怎么做好內(nèi)存管理(內(nèi)存管理機(jī)制,原則)
3.1內(nèi)存管理的原則:
一,誰創(chuàng)建,誰release
1>如果你是通過alloc,copy,new來創(chuàng)建了一個對象,那么你就得調(diào)用release/autorelease操作
二,誰retain,誰release
只要你調(diào)用了retain,無論這個對象如何生成的,你都必須調(diào)用release
總結(jié):有始有終,有加有減,