十二:内存简单介绍和OC的内存管理
一、內存簡單介紹
內存結構
1、運行時分配
(1)棧:用戶存放程序臨時創建的局部變量(先進后出)。
(2)堆:動態分配內存段。
2、編譯器分配
(1)BSS段:存放未初始化的全局變量和靜態變量。
(2)數據段:已初始化的全局變量和靜態變量。
(3)代碼段:執行代碼的一塊區域。
地址由低到高:代碼段 -> 數據段 -> BSS段-> 堆 -> 棧?
內存分配方式
1、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
2、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
3、從堆上分配,亦稱動態內存分配。動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現內存泄漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。
?
二、OC內存管理(iOS7.0后不用手動管理,可以了解相關原理)
1、進行內存管理的原因:是由于移動設備的內存極其有限,所以每個APP所占的內存也是有限制的,當app所占用的內存較多時,系統就會發出內存警告,這時需要回收一些不需要再繼續使用的內存空間,比如回收一些不再使用的對象和變量等。
2、內存管理范圍:任何繼承NSObject的對象,對其他的基本數據類型無效。
本質原因是存儲空間不一樣,對象存儲于堆中,而其它局部變量主要存放于棧中,當代碼塊結束時這個代碼塊中涉及的所有局部變量會被回收,指向對象的指針也被回收,此時對象已經沒有指針指向,但依然存在于內存中,造成內存泄露。
3、對象的基本結構:每個OC對象都有自己的引用計數器,是一個整數表示對象被引用的次數,即現在有多少東西在使用這個對象。對象剛被創建時,默認計數器值為1,當計數器的值變為0時,則對象銷毀。
在每個OC對象內部,都專門有4個字節的存儲空間來存儲引用計數器。
引用計數器的作用:判斷對象是否需要回收的唯一依據就是計數器是否為0,若不為0則存在。 4、當給對象發送消息時,進行引用計數器操作Retain消息:使引用計數器+1,改方法返回對象本身
Release消息:使引用計數器-1(并不代表釋放對象)
retainCount消息:獲得對象當前的引用計數器值
5、當一個對象的引用計數器為0時,那么它將被銷毀,其占用的內存被系統回收。當對象被銷毀時,系統會自動向對象發送一條dealloc消息,一般會重寫dealloc方法,書寫格式如下:
1 - (void)dealloc 2 { 3 [super dealloc] //必須調用必須調用調用此方法,且必須寫在最后 4 }6、注意事項:
野指針錯誤:訪問了一塊壞的內存(已經被回收的,不可用的內存)。
僵尸對象:所占內存已經被回收的對象,僵尸對象不能再被使用。(打開僵尸對象檢測)
空指針:沒有指向任何東西的指針(存儲的東西是0,null,nil),給空指針發送消息不會報錯
注意:不能使用[p retaion]讓僵尸對象起死復生。
7、內存管理原則
(1)只要還有人在使用某個對象,那么這個對象就不會被回收。
?只要你想使用這個對象,那么就應該讓這個對象的引用計數器+1。
?當你不想使用這個對象時,應該讓對象的引用計數器-1。
(2)誰創建,誰release
?如果你通過alloc,new,copy來創建了一個對象,那么你就必須調用release或者autorelease方法
?不是你創建的就不用你去負責
(3)誰retain,誰release。只要你調用了retain,無論這個對象時如何生成的,你都要調用release。
?
三、內存管理中的循環引用問題以及解決
若使用#import的方式相互包含,就會形成了循環引用。這時可以使用一個@class來代替其中一個#improt來解決循環引用問題,提高性能!
@class僅僅告訴編譯器,在進行編譯的時候把后面的名字作為一個類來處理。
書寫規范:@class 類名;
作用:聲明一個類,告訴編譯器某個名稱是一個類。
具體用法:1、在.h文件中使用@class來聲明類。
2、在.m文件中真正要使用到的時候,使用#import來包含類中的所有東西。
3、兩端循環引用的解決方法:一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)。
轉載于:https://www.cnblogs.com/hissia/p/5448410.html
總結
以上是生活随笔為你收集整理的十二:内存简单介绍和OC的内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Redis开发与运维》学习第十章
- 下一篇: 四大主流芯片架构(X86、ARM、RIS