ARC
- OC使用引用計數(shù)機制來管理內(nèi)存,每次runloop完成一個循環(huán)的時候牲蜀,都會檢查對象的retainCount笆制,如果retainCount為0,就釋放
- 內(nèi)存管理的原則:
- 只要還有人用這個對象各薇,那么這個對象就不會被回收
- 如果想使用這個對象项贺,就讓他的引用計數(shù)+1
- 當(dāng)不再使用某個對象的時候,就讓它的引用計數(shù)-1
- 誰創(chuàng)建誰release 誰retain 誰release
- 總起來說就是有加就有減
- alloc allocWithZone時峭判,該對象引用計數(shù)加1
- copy:如果時mutableCopy开缎,則為深拷貝,會產(chǎn)生新的對象林螃,并且新的對象的引用計數(shù)為1奕删,如果時copy,則為淺拷貝疗认,只是拷貝了原對象的地址完残,原對象引用計數(shù)+1
- autorelease:把該對象加入自動釋放池,當(dāng)自動釋放池釋放時横漏,其內(nèi)所有的對象引用計數(shù)-1
- 自動釋放池何時被銷毀谨设?簡單的看,是autoreleasse的}執(zhí)行完之后缎浇。而實際情況是當(dāng)前的runloop迭代結(jié)束時釋放的扎拣,而它能夠釋放的原因是系統(tǒng)在每個runloop中都加入了自動釋放池的Push和pop,底層是通過Observer監(jiān)聽Runloop的狀態(tài)素跺,一旦監(jiān)聽到RunLoop即將進入睡眠等待狀態(tài)二蓝,就釋放自動釋放池
- 多次調(diào)用對象的autoreleasse方法會導(dǎo)致野指針異常
- 注意:iOS中沒有垃圾回收機制,autorelease只是延遲時間統(tǒng)一釋放指厌,而垃圾回收機制是每隔一段時間詢問程序刊愚,看是否有指針指向?qū)ο螅绻芯蛯⑺厥?/li>
- 如何解決ARC機制下類的相互引用:
- .h文件中使用@class關(guān)鍵字聲明一個類
- 兩端不能都用強指針踩验,一端用strong鸥诽,一端用weak