MRC原理
MRC: 手動管理內(nèi)存(retain, release, autorelease,不多說) 持有對象,retain+1 ,引用計數(shù)加1, 釋放對象:release -1, 引用計數(shù)減1,當(dāng)引用計數(shù)為0時,會自動釋放內(nèi)存. autorelease對象內(nèi)存的管理放到autoreleasepool中, 當(dāng)pool drain時,回收內(nèi)存. (這是基于 objective-c的運行時特性和垃圾回收機制)
MRC下內(nèi)存管理的缺點:
1嫂易、釋放一個堆內(nèi)存時,首先要確定指向這個堆空間的指針都被release了掐禁。(避免提前釋放)
2怜械、釋放指針指向的堆空間,首先要確定哪些指向同一個堆傅事,這些指針只能釋放一次缕允。(避免釋放多次,造成內(nèi)存泄露)
3蹭越、模塊化操作時灼芭,對象可能被多個模塊創(chuàng)建和使用,不能確定最后由誰釋放
多線程操作時般又,不確定哪個線程最后使用完畢彼绷。
ARC原理
ARC的規(guī)則就是只要對象沒有強指針引用,就會被釋放掉茴迁,換而言之 只要還有一個強引用指針變量指向?qū)ο蠹拿酰敲催@個對象就會存在內(nèi)存中。弱指針指向的對象堕义,會被自動變成空指針(nil指針)猜旬,從而不會引發(fā)野指針錯誤。
ARC有什么好處
引用計數(shù)方式的內(nèi)存管理方式?jīng)]有變倦卖,只是自動地幫我們?nèi)ヌ幚硪糜嫈?shù)strong變量在超出變量作用域時洒擦,會自動釋放其所retain的對象,即自動調(diào)用release(編譯器自動插入release怕膛,用clang看程序匯編輸出可以看出來熟嫩,插入objc_release)
ARC缺點:
1.雖然ARC給我們編程帶來的很多好多,但也可能出現(xiàn)內(nèi)存泄露褐捻。如下面兩種情況:
循環(huán)參照:A有個屬性參照B掸茅,B有個屬性參照A椅邓,如果都是strong參照的話,兩個對象都無法釋放昧狮。
解決辦法:一段用強引用景馁,一段用弱引用。outlet的控件屬性都是weak修飾逗鸣,因為他們已經(jīng)被父控件強引用合住。
死循環(huán):如果有個ViewController中有無限循環(huán),也會導(dǎo)致即使ViewController對應(yīng)的view消失了撒璧,ViewController也不能釋放聊疲。
2.ARC會造成額外的retain/release,造成不必要的消耗沪悲,正是因為這樣它會比MRC慢一點 不過這些額外的引用計數(shù)暴增了代碼運行的正確性
ARC只對OC對象的進行內(nèi)存管理获洲,對于CoreFundation的api使用,他的對象所有權(quán)沒有移交給OC對象管理殿如,都需要手動去釋放」鄙海現(xiàn)在Xcode支持ARC/MRC混合編碼
<big>一個iOS學(xué)習(xí)路上的小學(xué)僧,歡迎指正!