2016年8月19日 星期五

[Objective-C] __weak與__block與__strong的介紹

在使用block時,會看到這三個東西,這三個又是做什麼的呢?

在這邊用一些例子來做解釋。

__block

在block裡面,要存取外面的變數時,要在變數前面加上這個關鍵字。

舉例來說。



你想要在block去修改外面的變數,如果這樣寫的話會有錯誤,如果要在block裡面去修改變數,則要在前面加上__block關鍵字。



__weak與__strong

這兩個會一起做說明,你可以先創一個class,在裡面加入一個方法來做測試,

就像這樣。





此時,先做第一個實驗,在block之中去執行剛才那個class的方法,

執行block後,馬上將此物件設為nil,在執行一次block。



你會發現,明明設為nil了,在block裡面卻還會執行,因為這個block產生了循環引用的問題,那麼該怎麼解決呢,你可以加入__weak關鍵字。



此時,就可以解決循環引用的問題,在這個block裡面並不是強引用,因此當外面設為nil時,block裡面就會變空了。

這樣看起來挺美好的,但是其實還有一個問題,當你的block在執行時,外面有人將設為nil時,你會發現裡面也會變成nil。



在block裡面等五秒,然後同時,外面設為nil,五秒後你會發現並沒有執行這個方法,因為已經被設為nil了,你只要在裡面加上__strong關鍵字,在block中就會是強參考



不過要在設nil之前稍微等一下,以免還沒進去block就被設了XD。

此時你就不怕在block執行時,外面設nil會發生一些怪問題。

可是也許外面設nil,block執行時也會一起變成nil是你需要的效果,你就可以不用加入strong關鍵字。

透過這些實驗應該能稍微了解三者的差異了。

如果這篇文章有任何錯誤或者問題,歡迎提出。