引用計數法:
持有時+1,釋放時-1,當引用計數爲0時,進行dealloc。
四法則:
- 自己生成對象,自己持有(alloc,copy….)
- 非自己生成對象也可以持有
- 自己不持有時,需要釋放
- 非自己持有對象,無法釋放
MRC ,ARC
MRC是我們自己手動添加retain,release。
ARC是編譯器的特性,自動插入retain和release。
循環引用
MRC:
assign,手動置nil。
ARC:
__weak,當對象沒有強引用時,自動置nil。
爲什麼weak會自動置nil?
weak會有一個weak表(散列表),對象地址作爲鍵值,一個鍵值可以有多個對象地址。在對象引用計數爲0 時,執行dealloc。
調用obj_clear_deallocing方法會從weak表中獲取廢棄對象地址的鍵值記錄,將所有變量地址置爲nil,然後從weak表中刪除該記錄。
__weak typeof (self)
@weakify , @strongify
Block中使用多層的話,需要加多個@strongify嗎?
需要,若是不加的話,使用的是上一層嵌套的strong類型的self,加上@strongify的話,就是指與@weakify對應的__strong類型的self__weak。
如果使用@weakify不使用@strongify的話,會出現什麼問題?
self被銷燬時,會引起crash。
在MRC到ARC之間,使用__unsafe_unretained,當對象沒有被強引用時,並不會置nil。(存在的原因就是沒有出現weak,或者是C語言結構體中引用OC對象時)
我們常說的代理對象,需要使用weak修飾,原因是爲何?造成循環引用,如何造成?
比如說TableView使用的代理,TableViewController持有的tableView,即self.tableview.delegate = self;
viewController(也就是self)持有tableviewtableview.delegate 又持有viewController(self).
Aoturelease
- 延遲釋放對象
- 減少內存峯值
放入autoreleasepool中,在runloop結束時(例如一次事件的觸發),將pool中的對象進行調用release方法。
AutoreleasePoolPage
固定大小:4096字節
出現AutoreleasePool循環嵌套的問題,如何體現是哪個AutoreleasePool的對象?
會在AutoreleasePoolPage列表中嵌套一層,會加一個哨兵對象。
Toll-Free Bridging 橋接 CoreFoundation 與 Foundation之間的轉換
_bridge 只是將聲明類型轉換,內存管理不變
_bridge_retained 常用在將OC對象轉化成CF對象,且OC對象的所有權也交給CF對象來管理,即OC對象轉化成CF對象 ARC->MRC
_bridge_transfer 常用在CF對象轉化成OC對象時,將CF對象的所有權交給OC對象 MRC->ARC