一般來說我們總會在設置Block之后,在合適的時間回調Block,而不希望回調Block的時候Block已經(jīng)被釋放了,所以我們需要對Block進行copy,copy到堆中,以便后用。
當一個Block被Copy的時候,如果你在Block里進行了一些調用,那么將會有一個強引用指向這些調用方法的調用者,有兩個規(guī)則:
如果你是通過引用來訪問一個實例變量,那么將強引用至self
如果你是通過值來訪問一個實例變量,那么將直接強引用至這個“值”變量
蘋果官方文檔里有兩個例子來說明這兩種情況:

20140729170542000.jpeg
上面第一種情況相當于用self.xxx來訪問實例變量,所以強引用指向了self;第二種情況把實例變量變成了本地臨時變量,強引用將直接指向這個本地的臨時變量。大多數(shù)情況下,我們只用處理第一種情況就行了,因為第二種情況雖然會造成循環(huán)引用,但是臨時變量很快就被釋放了,不會造成真正的循環(huán)引用。要避免強引用到self的話,用__weak把self重新引用一下就行了,像這樣:
<pre>__weak ViewController *weakSelf = self; </pre>