iT邦幫忙

0

iOS APP 開發 OC 第二十天,自動釋放池

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。

使用注意

  1. 只有在自動釋放池當中調用了對象的autorelease方法,這個對象才會被儲存到這個自動釋放池當中。如果只是將對象的創建代碼寫在自動釋放池當中,而沒有調用對象的autorelease方法,是不會將這個對象儲存到這個自動釋放池當中的。
  2. 對象的創建可以在自動釋放池外面,在自動釋放池之中調用autorelease方法,就可以將這個對象儲存到這個自動釋放池裡面。
  3. 如果對象的autorelease方法的調用放在自動釋放池外面,是無法將其儲存的這個自動釋放池當中的。autorelease 的調用只有放在自動釋放池當中,才可以將其存備道自動釋放池當中,對象的創建可以在外面。
  4. 當自動釋放池結束的時候,僅僅是對存備在自動釋放池中的對象發送一條release消息,而不是銷毀對象。
  5. 如果在釋放池當中,調用同一個對象的autorelease方法多次,就會將對象儲存多次到自動釋放池當中。在自動釋放池結束之後,會為對象發送多條release消息。所以,一個自動釋放池之中,只autorelease 一次,只將這個對象放一次,否則會出現 wildpointer錯誤。
  6. 如果在自動釋放池中,調用了儲存到自動釋放中的對象的release方法。在自動釋放池結束的時候,還會再調用對象的release方法。在自動釋放池結束的時候,還會再調用release方法。這個時候就有可能造成wildpointer操作。
  7. 將對象儲存到自動釋放池,並不會使對象的引用計數器+1。所以其好處就是:創建對象將對象儲存在自動釋放池,就不需要再寫release了。
  8. 自動釋放池可以嵌套。調用對象的autorelease方法,會將對象加入到當前自動釋放池之中,只有在當前自動釋放池結束的時候才會向對象發送release消息。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言