block循環引用的一種特殊形式及解決方法

眾所周知,解決block循環引用最常用的方式就是 使用__weak typeof(xx) name = xx; 解決
今天遇到個神奇的問題 明明已經使用了weakSelf了 但是控制器在pop后怎么也釋放不了
最后發現是在block內使用了帶下劃線的變量去取值導致了block對控制器的強引用

//A中有對象b 和成員變量x  對象b中有block c
A *a = [A new];
// a.b  a.b.c   a.x
__weak typeof(A)  wa = A;
a.b.c = ^{
  //注意 使用wa去操作的是可以的 
[wa.b action];  
[wa.x action];
/**
錯誤用法
這是在A的.m內操作  所以可以使用_b   _x
但是如果在block中使用_b 或者_x的話
那么這個block 其實會對a 有強引用的  如此__weak就沒有用了 最后a這個對象怎么也釋放不了
解決方法: 1.想銷毀之前把這個block置為nil 2.還是使用點語法去取變量值吧
*/
  
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容