__block和__weak的區(qū)別

1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數(shù)據(jù)類型。 2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)。
3.__block對象可以在block中被重新賦值,__weak不可以。

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強引用一次,從而不會出現(xiàn)循環(huán)引用問題。

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。自然不會導致循環(huán)引用問題,因為蘋果文檔已經(jīng)說的很清楚,當原對象沒有任何強引用的時候,弱引用指針也會被設置為nil。

因此,__block和__weak修飾符的區(qū)別其實是挺明顯的:
在MRC 時代,__block 修飾,可以避免循環(huán)引用;ARC時代,__block 修飾,同樣會引起循環(huán)引用問題;
1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數(shù)據(jù)類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int等)。
3.__block對象可以在block中被重新賦值,__weak不可以。
PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品,不過不會被自動置空為nil。所以盡可能不要使用這個修飾符,它既不持有強引用也不持有弱引用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 API Reference對__block變量修飾...
    石虎132閱讀 2,091評論 0 11
  • 一、__block 優(yōu)點: 擴大變量的作用域。 控制對象的生命周期,防止循環(huán)引用。 是強引用,在非ARC環(huán)境下可以...
    董二千閱讀 3,788評論 4 5
  • 1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數(shù)據(jù)類型。 2.__weak...
    世玉茹花閱讀 392評論 0 0
  • ARC的本質 ARC是編譯器(時)特性,而不是運行時特性,更不是垃圾回收器(GC)。 Automatic Refe...
    成熱了閱讀 630評論 0 1
  • 曾經(jīng)有哪一個瞬間,你覺得自己特別沒用? 讀書的時候有一次和室友出去兼職發(fā)傳單,在街角看到一只小小的臟兮兮的小狗,看...
    _檸夢閱讀 683評論 9 7