__weak與__block的區別

時間:2015-05-04 12:04:30      閱讀:1215      評論:0      收藏:0      [點我收藏+]

標籤:修飾符   block   weak   ios   retain   

API Reference對__block變量修飾符有如下幾處解釋:

//A powerful feature of blocks is that they can modify 
variables in the same lexical scope. You signal that a block 
can modify a variable using the __block storage type 
modifier. 

//At function level are __block variables. These are mutable
 within the block (and the enclosing scope) and are preserved
 if any referencing block is copied to the heap.

大概意思歸結出來就是兩點:
1.__block對象在block中是可以被修改、重新賦值的。
2.__block對象在block中不會被block強引用一次,從而不會出現循環引用問題。

API Reference對__weak變量修飾符有如下幾處解釋:

__weak specifies a reference that does not keep the 
referenced object alive. A weak reference is set to nil when
there are no strong references to the object.

使用了__weak修飾符的對象,作用等同於定義爲weak的property。自然不會導致循環引用問題,因爲蘋果文檔已經說的很清楚,當原對象沒有任何強引用的時候,弱引用指針也會被設置爲nil。

因此,__block和__weak修飾符的區別其實是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
3.__block對象可以在block中被重新賦值,__weak不可以。
PS:__unsafe_unretained修飾符可以被視爲iOS SDK 4.3以前版本的__weak的替代品,不過不會被自動置空爲nil。所以儘可能不要使用這個修飾符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章