本文圍繞內存管理的幾種方法展開敘述。
1.內存管理是什么?
內存管理,就是對內存資源進行優化。
2.內存管理的三種方法?
Objective-C的內存管理主要有三種方式ARC(自動內存計數)、MRC(手動內存計數)、內存池。
3.MRC是什么?管理原則是什么?存在的問題?
MRC,全稱MannulReference Counting,手動內存管理 (手動引用計數),需要程序員手動的創建對象申請內存,然后再手動的釋放。
MRC管理內存的原則:誰創建,誰釋放。
也就是說,在使用的過程中,誰retain,誰release;或者誰alloc,誰release。
在使用MRC時,當引用計數為0時,必須回收,引用計數不為0,則不回收;如果內存計數為0了,沒回收,會造成內存泄露。 如果想使用已經創建好的某個對象(別人創建的),不能直接拿過去用,需要先retain(讓計數+1),用完之后應該release(計數-1),否則會造成野指針。
PS:野指針(不知道指向哪里的指針),它指向了一塊不屬於它的內存,可能是別人的內存,也可能之前是自己的,但是被別人釋放了。
避免野指針的方式就是釋放之后,讓指針等於nil,這個時候在重復釋放,則不會提示錯誤。
nil:又名空,是操作系統持有的內存,任何人都奪不去的內存。
4.ARC是什么?存在的問題?
ARC是iOS 5推出的新功能,全稱叫Automatic Reference Counting,自動引用計數。簡單地說,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。
使用ARC,只要某個對象被任一strong指針指向,那么它將不會被銷毀。如果對象沒有被任何strong指針指向,那么就將被銷毀。
使用ARC后,不允許調用release,retain、retainCount等方法。
允許重寫dealloc,但是不允許調用[super dealloc],系統會默認調用[super dealloc]。
雖然ARC給我們編程帶來的很多好多,但也可能出現內存泄露。如下面兩種情況:
-
循環參照:A有個屬性參照B,B有個屬性參照A,如果都是strong參照的話,兩個對象都無法釋放。
-
死循環:如果有個ViewController中有無限循環,也會導致即使ViewController對應的view消失了,ViewController也不能釋放。
5.內存池是什么?
autorelease類似於release,但是不等同於它,release調用后引用計數馬上-1。
autorelease是在創建對象的時候寫的,表示加入自動釋放池,當釋放池銷毀時,才調用引用計數-1。
自動釋放池,需要手動創建。
當調用[pool drain]方法時,會調用池中得全部對象,release掉他們。
6.三種方法的優缺點?
ARC優點是使用起來比較簡單,不用自己考慮內存問題等,在MRC時代你需要自己retain一個想要保持的對象,而現
在不需要了。現在唯一要做的是用一個指針指向這個對象,只要指針沒有被置空,對象就會一直保持在堆上。當將指針指向新值時,原來的對象會被release一次。
ARC缺點是如果出現循環引用的時候,容易出現內存泄露。此外,許多第三方的庫是用MRC寫的,如果使用,需要做一定處理。
MRC優點是程序員對於內存的控制比較強,可以很好的解決內存問題。
MRC 缺點是需要手動的寫大量代碼管理內存,保證誰創建誰釋放,避免空指針,要很仔細才可以。
autorelease優點:可以簡化操作,由自動釋放池管理。只有在自動釋放池銷毀時才對里面的對象進行銷毀,程序員不用關心對象的銷毀時間,也不用再去調用release。
autorelease缺點:因為是延遲釋放,可以延長對象的生命周期。所以不要隨意使用,因為對象生命周期延長,會一直持有內存,會減慢速度。
適合占內存小的對象使用。