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