Block呼叫引起的記憶體洩露

2021-06-22 14:27:46 字數 1313 閱讀 1341

@前面的文章講到,在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 plain

copy

__block 

dnwthirdvideosubclassviewcontroller

*otherself = 

self

;  [_videoplayviewchangeviewbackground

:^];  

打了很多斷點,測試出來問題就是出在這裡,很多人可能會問,已經用__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修飾,是一定會產生迴圈引用而導致記憶體洩露的問題

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

依舊Block呼叫引起的記憶體洩露

前面的文章講到,在block中用到self self特指uiviewcontroller 需要用 block或者 weak修飾 mrc與arc的區別 因為block呼叫會對其裡面的物件引用計數加1,如果你不確定你呼叫的block是否會產生迴圈引用的話,最好用 block或 weak修飾.當然,如果你...

scanf 引起的記憶體洩露

vc6下好好的 放到2013 程式裡面一直報錯,提示run time check failure 2 stack around the variable wregaddr was corrupted.檢查發現出現錯誤的地方 如下 wordwregaddr 0,wregdata 0 sscanf bu...

tensorflow引起的記憶體洩露

計算機配置記憶體12g,視訊記憶體4g,執行有10分鐘左右就提醒說記憶體不夠用然後退出執行,直覺是程式bug問題 終於找到靠譜解決方案 這個部落格的第二個給了大致的講解,在給出的附錄中 講解更詳細,並給出了解決的方法 即 sess.graph.finalize 使得整個graph變為唯讀的,不能再向...