Block裡用self造成迴圈引用

2022-03-29 21:02:57 字數 1071 閱讀 6611

__weak typeof(self) weakself = self;

扯了這麼多,回到block的迴圈引用問題,由於我們很多行為會導致block的copy,而當block被copy時,會對block中用到的物件產生強引用(arc下)或者引用計數加一(non-arc下)。

如果遇到這種情況:

123

4567

89

@property(nonatomic, readwrite, copy) completionblock completionblock;

//****************************************

self.completionblock = ^ }};

物件有乙個block屬性,然而這個block屬性中又引用了物件的其他成員變數,那麼就會對這個變數本身產生強應用,那麼變數本身和他自己的block屬性就形成了迴圈引用。在arc下需要修改成這樣:

123

4567

89

@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啦,這就打破了迴圈引用。

self 在block中的記憶體管理

block對於其變數都會形成strong reference,對於self也會形成strong reference 而如果self本身對block也是 strong reference 的話,就會形成 strong reference 迴圈,造成記憶體洩露,為了防止這種情況發生,在block外部應該...

OC裡Self的應用

1.應用場景 1 用在類方法裡 2 用在物件方法裡 3 訪問成員變數 4 self在oc的記憶體管理特殊使用 2.在物件方法裡的使用 指定的是當前物件 1 我們先建立乙個person類,裡面有兩個方法不帶引數的run 與帶引數的eat 方法 然後呼叫run 方法 inte ce person nso...

block中用到self要特別注意記憶體洩露問題

self強引用會使引用計數器加1,如果在dismissviewcontroller時,如 self dismissviewcontrolleranimated no completion nil 不呼叫dealloc方法,需要將self 轉為弱引用 weak typeof self selfvc s...