ios 避免迴圈引用

lihaiyin發表於2015-07-15

類似網路請求的情況下會導致迴圈引用,但是

如果網路請求的物件是區域性變數,就必須用self,不能用weakSelf,否則,一旦當前方法所在物件銷燬,那weakSelf就為空了(如果目的是這樣,那就另當別論了),因為block會被copy到堆中,然後當前方法中的記憶體從棧中銷燬,self為nil。

如果網路請求的物件是成員變數,就必須用weakSelf,不能用self,避免迴圈引用。

 

另外,如果巢狀網路請求,則需要整體考慮,“每一層級按照如上所述的規則使用”是錯誤的。在確保self存在的前提下,儘量多用weakSelf。就算self消失後可能不執行相關程式碼,但也不要導致迴圈引用

 

為何GCD中的block不需要用weakself?

原因是:self沒有對block進行引用,block在執行結束後會自動銷燬,只是block對self進行了單方面引用。

而什麼情況下才會有迴圈引用呢?如上所述,self持有block(例項變數、屬性等),同時block中使用了self;或者self持有的物件(某個屬性,例如ASIHTTPRequest)本身對block進行了引用(ASIHTTPRequest中有個回撥 block的屬性),而block又引用了self。

self  ----(非區域性變數的屬性或變數)-----> block----->self

self -----(非區域性變數的屬性或變數)-----> ASIHTTPRequest -----(非區域性變數的屬性或變數)-----> block----->self

具體見http://stackoverflow.com/questions/21987067/using-weak-self-in-dispatch-async-function

相關文章