1 自動釋放池的原理
存入到自動釋放池中的對象,在自動釋放池被銷毀的時候,會自動調用存儲在自動釋放池中的所有對象的release方法。
這樣,将建立的對象存儲到自動釋放池之中,就不再需要手動的release這個對象了。因為自動釋放池銷毀的時候,就會自動的調用自動釋放池中所有的對象的release。
2 如何建立自動釋放池
//{}表示這個自動釋放池的範圍
@autoreleasepool{
}
3 如何将對象存儲到自動釋放池之中
在自動釋放池之中調用對象的autorelease方法,就會将對象存儲到目前自動釋放池之中。
這個autorelease方法傳回的是對象本身,是以,我們可以這麼寫
@autoreleasepool {
Person *person = [[[Person alloc] init] autorelease];
}
這個時候,當這個自動釋放池執行完畢之後,就是立即為這個自動釋放池中的對象發送1條release消息。
4 注意事項
- 隻用在自動釋放池中調用了對象的autorelease方法,這個對象才會被存儲到這個自動釋放池中。
- 對象建立可以寫在自動釋放池外邊,在自動釋放池之中,調用對象的autorelease方法,就可以将對象存儲在自動釋放池之中。
- 如果對象的autorelease方法的調用放在自動釋放池的外面,就無法将其存儲在這個自動釋放池之中。
- 當自動釋放池結束的時候,僅僅是對存儲在自動釋放池中的對象發送1條release消息,而不是銷毀對象。
- 如果在自動釋放池中,調用對象多次autorelease方法。在自動釋放池結束的時候,會出現野指針問題。
- 在自動釋放池中,如果調用已經存儲在自動釋放池中對象的release方法,會出現野指針問題
- 将對象存儲到自動釋放池中,并不會使對象的引用計數器+1。
- 自動釋放池可以嵌套
5 autorelease使用規範
- 建立對象,将對象存儲到自動釋放池中,不需要手動release。
- 類方法建立對象,要求這個類方法中将建立的對象調用autorelease
+ (instancetype) person {
return [[[self alloc] init] autorelease];
}