block為什么用copy?

默認情況下,block是存檔在棧中,可能被隨時回收,需要copy操作。這也就是我們在定義block的時候用的是copy,而不是weak等等。

來看下面這個block定義:

// 默認是放在棧中,可能會被隨時銷毀

void (^blockName)() = ^{

};

// 進行一次copy操作,就可以放在堆中了。

// [blockName copy];

// 以下方法也一樣。但是只能在非ARC中使用。

// Block_copy(blockName);

// 用retain沒有用的原因:retain只是增加一次計數(shù),block內存還是在棧中,并沒有轉移到堆中。

再看下面這個block使用:

Person *person = [[Person alloc] init];

person.blockName = ^{

   person.age = 20;

};

如果block是copy,并且里面使用它所在的類的對象的話,這個對象永遠無法被釋放。即person對象在堆中是強指針,且person在blockName就在,而blockName指向的代碼也在堆中,即它的person.age=20的那些代碼也在堆中,而這些代碼中有person對象,所以又反過來指向person對象。就這么在相互指向的,永遠不能釋放。

解決方法,使用__weak修飾外部變量:

Person *person = [[Person alloc] init];

__weak Person *person0 = person;

person.blockName = ^{

   person0.age = 20;

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

推薦閱讀更多精彩內容

  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性,B...
    smile刺客閱讀 2,375評論 2 26
  • Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 740評論 2 1
  • 本文為轉載: 作者:zyydeveloper 鏈接:http://www.lxweimin.com/p/5f776a...
    Buddha_like閱讀 914評論 0 2
  • 這兩日,心情頗感沉重,告別了炎炎的夏日,短暫的秋還遷延著最后的留戀,在冬日威嚴將至之前給人溫暖和慰藉,身邊的朋友和...
    瀟湘秋雨閱讀 509評論 0 0
  • https://www.zhihu.com/question/36448325
    iOS_Developer閱讀 114評論 0 0