ARC
- OC使用引用計數機制來管理內存,每次runloop完成一個循環的時候,都會檢查對象的retainCount,如果retainCount為0,就釋放
- 內存管理的原則:
- 只要還有人用這個對象,那么這個對象就不會被回收
- 如果想使用這個對象,就讓他的引用計數+1
- 當不再使用某個對象的時候,就讓它的引用計數-1
- 誰創建誰release 誰retain 誰release
- 總起來說就是有加就有減
- alloc allocWithZone時,該對象引用計數加1
- copy:如果時mutableCopy,則為深拷貝,會產生新的對象,并且新的對象的引用計數為1,如果時copy,則為淺拷貝,只是拷貝了原對象的地址,原對象引用計數+1
- autorelease:把該對象加入自動釋放池,當自動釋放池釋放時,其內所有的對象引用計數-1
- 自動釋放池何時被銷毀?簡單的看,是autoreleasse的}執行完之后。而實際情況是當前的runloop迭代結束時釋放的,而它能夠釋放的原因是系統在每個runloop中都加入了自動釋放池的Push和pop,底層是通過Observer監聽Runloop的狀態,一旦監聽到RunLoop即將進入睡眠等待狀態,就釋放自動釋放池
- 多次調用對象的autoreleasse方法會導致野指針異常
- 注意:iOS中沒有垃圾回收機制,autorelease只是延遲時間統一釋放,而垃圾回收機制是每隔一段時間詢問程序,看是否有指針指向對象,如果有就將它回收
- 如何解決ARC機制下類的相互引用:
- .h文件中使用@class關鍵字聲明一個類
- 兩端不能都用強指針,一端用strong,一端用weak