預設情況下,block是存檔在棧中,可能被隨時**,需要copy操作。這也就是我們在定義block的時候用得時copy。而不是weak等等。
物件有乙個block屬性,然而這個block屬性中又引用了物件的其他成員變數,那麼就會對這個變數本身產生強應用,那麼變數本身和他自己的block屬性就形成了迴圈引用
@property(nonatomic, readwrite, copy) completionblock completionblock;
//****************************************
self.completionblock = ^
}};
arc解決辦法:
@property(nonatomic, readwrite, copy) completionblock completionblock;
//****************************************
__weak typeof(self) weakself = self;
self.completionblock = ^
};
也就是生成乙個對自身物件的弱引用,如果是倒霉催的專案還需要支援ios4.3,就用__unsafe_unretained替代__weak。如果是non-arc環境下就將__weak替換為__block即可。non-arc情況下,__block變數的含義是在block中引入乙個新的結構體成員變數指向這個__block變數,那麼__block typeof(self) weakself = self;
就表示block別再對self物件retain啦,這就打破了迴圈引用。
block迴圈引用問題
ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...
block 迴圈引用
結論 block作為成員變數,內部引用self的成員變數,必須使用self 弱引用 block作為區域性變數,無論怎樣寫,都不會對self造成強引用 block為變數 1 block為成員變數 typedef nsstring blockcc void inte ce twoviewcontroll...
block迴圈引用
底層原始碼 typedef void ghblock void struct main block impl 0 static void main block func 0 struct main block impl 0 cself static void main block copy 0 st...