類似網(wǎng)絡(luò)請求的情況下會導(dǎo)致循環(huán)引用厨姚,但是如果網(wǎng)絡(luò)請求的對象是局部變量,就必須用self凑兰,不能用weakSelf掌桩,否則,一旦當(dāng)前方法所在對象銷毀姑食,那weakSelf就為空了(如果目的是這樣波岛,那就另當(dāng)別論了),因為block會被copy到堆中音半,然后當(dāng)前方法中的內(nèi)存從棧中銷毀则拷,self為nil。
如果網(wǎng)絡(luò)請求的對象是成員變量曹鸠,就必須用weakSelf煌茬,不能用self,避免循環(huán)引用彻桃。
另外坛善,如果嵌套網(wǎng)絡(luò)請求,則需要整體考慮邻眷,“每一層級按照如上所述的規(guī)則使用”是錯誤的眠屎。在確保self存在的前提下,盡量多用weakSelf肆饶。就算self消失后可能不執(zhí)行相關(guān)代碼改衩,但也不要導(dǎo)致循環(huán)引用
為何GCD中的block不需要用weakself?
原因是:self沒有對block進(jìn)行引用驯镊,block在執(zhí)行結(jié)束后會自動銷毀葫督,只是block對self進(jìn)行了單方面引用。
而什么情況下才會有循環(huán)引用呢板惑?如上所述橄镜,self持有block(實例變量、屬性等)冯乘,同時block中使用了self蛉鹿;或者self持有的對象(某個屬性,例如ASIHTTPRequest)本身對block進(jìn)行了引用(ASIHTTPRequest中有個回調(diào) block的屬性)往湿,而block又引用了self妖异。
self ?----(非局部變量的屬性或變量)----->?block----->self
self -----(非局部變量的屬性或變量)-----> ASIHTTPRequest?-----(非局部變量的屬性或變量)-----> block----->self
具體見http://stackoverflow.com/questions/21987067/using-weak-self-in-dispatch-async-function