tags: OC 30 day
自動釋放池的原理
存入到自動釋放池中的對象,在自動釋放池被銷毀的時候,會自動調用儲存在該自動釋放池中的所有對象的release方法。
可以解決的問題:
將創建得對象,儲存在自動釋放池當中。就不再需要手動release這個對象了。
因為池子銷毀的時候,就會自動調用池中所有對想的release。
如何創建自動釋放池
@autoreleasepool {
}
這對大括弧代表這個自動釋放池的範圍。
如何將對象儲存在自動釋放池之中
在自動釋放池中調用對象的autorelease方法,就會將這個對象存入到當前自動釋放池之中。這個autorelease方法返回的是對象本身。所以我們可以這麼寫
@autoreleasepool {
Person *p1 = [[[Person alloc]init]autorelease];
}
可讀性比較高的寫法
@autoreleasepool {
Person *p1 = [[Person alloc]init];
[p1 autorelease];
}
這個時候,當這個自動釋放池執行完畢之後,就會立即為這個自動釋放池的對象發送一條release消息。
目前為止,我們感受到的autorelease的好處:
創建對象,調用對象的autorelease方法,將這個對象存入到當前的自動釋放池當中。
我們就不需要再去release,因為自動釋放池銷毀的時候,就會自動的調用池中所有對象的release。
使用注意
- 只有在自動釋放池當中調用了對象的autorelease方法,這個對象才會被儲存到這個自動釋放池當中。如果只是將對象的創建代碼寫在自動釋放池當中,而沒有調用對象的autorelease方法,是不會將這個對象儲存到這個自動釋放池當中的。
- 對象的創建可以在自動釋放池外面,在自動釋放池之中調用autorelease方法,就可以將這個對象儲存到這個自動釋放池裡面。
- 如果對象的autorelease方法的調用放在自動釋放池外面,是無法將其儲存的這個自動釋放池當中的。autorelease 的調用只有放在自動釋放池當中,才可以將其存備道自動釋放池當中,對象的創建可以在外面。
- 當自動釋放池結束的時候,僅僅是對存備在自動釋放池中的對象發送一條release消息,而不是銷毀對象。
- 如果在釋放池當中,調用同一個對象的autorelease方法多次,就會將對象儲存多次到自動釋放池當中。在自動釋放池結束之後,會為對象發送多條release消息。所以,一個自動釋放池之中,只autorelease 一次,只將這個對象放一次,否則會出現 wildpointer錯誤。
- 如果在自動釋放池中,調用了儲存到自動釋放中的對象的release方法。在自動釋放池結束的時候,還會再調用對象的release方法。在自動釋放池結束的時候,還會再調用release方法。這個時候就有可能造成wildpointer操作。
- 將對象儲存到自動釋放池,並不會使對象的引用計數器+1。所以其好處就是:創建對象將對象儲存在自動釋放池,就不需要再寫release了。
- 自動釋放池可以嵌套。調用對象的autorelease方法,會將對象加入到當前自動釋放池之中,只有在當前自動釋放池結束的時候才會向對象發送release消息。