Block調用引起的內存泄露

@前面的文章講到,在Block中用到self(self特指UIViewController),需要用__block或者__weak修飾(MRC與ARC的區別),因爲Block調用會對其裏面的對象引用計數加1,如果你不確定你調用的Block是否會產生循環引用的話,最好用__block或__weak修飾.當然,如果你確定並不會產生循環引用的情況,那你可以放心的self.  self. (~O(∩_∩)O~).


@自從知道了block容易產生內存泄露的情況,我在很長的一段時間內,只要用到了block,只要裏面有self,我全部用__block修飾了(偷懶的做法),但是最近,即使我這樣的寫了,還是出現了內存泄露的情況,dealloc()一直不執行,找了很久,找了很久,全部都加了__block修飾,依舊泄露,最終發現問題是出現在一個屬性上.


@先來看下面這段問題代碼:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. __block DNWThirdVideoSubclassViewController *otherSelf = self;  
  2. [_videoPlayView changeViewBackGround:^{  
  3.          
  4.    [otherSelf pushDNWWedViewController:_thirdData.web_url];  
  5. }];  

打了很多斷點,測試出來問題就是出在這裏,很多人可能會問,已經用__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修飾,是一定會產生循環引用而導致內存泄露的問題


@最後套用一句:"具體問題具體分析啦!"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章