內存管理

引用計數法:
持有時+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
  1. 延遲釋放對象
  2. 減少內存峯值

放入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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章