天天看點

IOS開發(15)Objective-C-記憶體管理-自動釋放池(@autoreleasepool)

1 自動釋放池的原理

存入到自動釋放池中的對象,在自動釋放池被銷毀的時候,會自動調用存儲在自動釋放池中的所有對象的release方法。

這樣,将建立的對象存儲到自動釋放池之中,就不再需要手動的release這個對象了。因為自動釋放池銷毀的時候,就會自動的調用自動釋放池中所有的對象的release。

2 如何建立自動釋放池

//{}表示這個自動釋放池的範圍
    @autoreleasepool{

    }
           

3 如何将對象存儲到自動釋放池之中

在自動釋放池之中調用對象的autorelease方法,就會将對象存儲到目前自動釋放池之中。

這個autorelease方法傳回的是對象本身,是以,我們可以這麼寫

@autoreleasepool {
        Person *person = [[[Person alloc] init] autorelease];   
    }
           

這個時候,當這個自動釋放池執行完畢之後,就是立即為這個自動釋放池中的對象發送1條release消息。

4 注意事項

  1. 隻用在自動釋放池中調用了對象的autorelease方法,這個對象才會被存儲到這個自動釋放池中。
  2. 對象建立可以寫在自動釋放池外邊,在自動釋放池之中,調用對象的autorelease方法,就可以将對象存儲在自動釋放池之中。
  3. 如果對象的autorelease方法的調用放在自動釋放池的外面,就無法将其存儲在這個自動釋放池之中。
  4. 當自動釋放池結束的時候,僅僅是對存儲在自動釋放池中的對象發送1條release消息,而不是銷毀對象。
  5. 如果在自動釋放池中,調用對象多次autorelease方法。在自動釋放池結束的時候,會出現野指針問題。
  6. 在自動釋放池中,如果調用已經存儲在自動釋放池中對象的release方法,會出現野指針問題
  7. 将對象存儲到自動釋放池中,并不會使對象的引用計數器+1。
  8. 自動釋放池可以嵌套

5 autorelease使用規範

  1. 建立對象,将對象存儲到自動釋放池中,不需要手動release。
  2. 類方法建立對象,要求這個類方法中将建立的對象調用autorelease
+ (instancetype) person {
        return [[[self alloc] init] autorelease];
    }