1. 程式人生 > >如何避免在Block裡用self造成迴圈引用

如何避免在Block裡用self造成迴圈引用

一般來說我們總會在設定Block之後,在合適的時間回撥Block,而不希望回撥Block的時候Block已經被釋放了,所以我們需要對Block進行copy,copy到堆中,以便後用。

當一個Block被Copy的時候,如果你在Block裡進行了一些呼叫,那麼將會有一個強引用指向這些呼叫方法的呼叫者,有兩個規則:

  • 如果你是通過引用來訪問一個例項變數,那麼將強引用至self
  • 如果你是通過值來訪問一個例項變數,那麼將直接強引用至這個“值”變數
蘋果官方文件裡有兩個例子來說明這兩種情況:
上面第一種情況相當於用self.xxx來訪問例項變數,所以強引用指向了self;第二種情況把例項變數變成了本地臨時變數,強引用將直接指向這個本地的臨時變數。大多數情況下,我們只用處理第一種情況就行了,因為第二種情況雖然會造成迴圈引用,但是臨時變數很快就被釋放了,不會造成真正的迴圈引用。要避免強引用到self的話,用__weak把self重新引用一下就行了,像這樣:
__weak ViewController *weakSelf = self;