@前面的文章講到,在Block中用到self(self特指UIViewController),需要用__block或者__weak修飾(MRC與ARC的差別),因為Block調用會對其裡面的對象引用計數加1,如果你不确定你調用的Block是否會産生循環引用的話,最好用__block或__weak修飾.當然,如果你确定并不會産生循環引用的情況,那你可以放心的self. self. (~O(∩_∩)O~).
@自從知道了block容易産生記憶體洩露的情況,我在很長的一段時間内,隻要用到了block,隻要裡面有self,我全部用__block修飾了(偷懶的做法),但是最近,即使我這樣的寫了,還是出現了記憶體洩露的情況,dealloc()一直不執行,找了很久,找了很久,全部都加了__block修飾,依舊洩露,最終發現問題是出現在一個屬性上.
@先來看下面這段問題代碼:
打了很多斷點,測試出來問題就是出在這裡,很多人可能會問,已經用__block修飾了,而且并沒有出現self呀!請注意_thirdData這個屬性,聲明的時候是@property (nonatomic,retain)DNWThirdData *thirdData,它是被self所持有,一次釋放操作是放在dealloc中,也就是self被釋放,_thirdData也釋放.在Block中,調用了_thirdData,雖然沒有用self.thirdData,但是正如前面所說,它是被self持有,編譯通路_thirdData時,會找到持有它的self,對其引用計數加1,是以這裡就算沒有用到self,self的引用計數也被加1了,這也說明并不是沒顯示的調用self就不會對其引用計數加1,這個錯誤真是讓我郁悶了好久.接下來改正:[otherSelf
pushDNWWedViewController:otherSelf.thirdData.web_url];就OK了
@當然,還是得說明,如果你确定你的Block調用隻是局部的或者不會發生循環引用的問題,那就不用考慮這些了.
@而我這個例子,changeViewBackGround這個Block是屬性videoPlayView的屬性,而videoPlayView又是self的屬性,呗self持有,要等待self的釋放才能釋放,因為如果不用__block修飾,是一定會産生循環引用而導緻記憶體洩露的問題
@最後套用一句:"具體問題具體分析啦!"