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

2021-06-28 01:29:49 字數 1286 閱讀 2210

@前面的文章講到,在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修飾.當然,如果你...

C 反射呼叫WebService引起記憶體洩漏

最近寫了乙個小工具,用來定時檢測公司各台伺服器上的webservice是否工作正常.如果無法訪問則報警.開發思路也很簡單,設定乙個timer,定時啟動多個執行緒 每個執行緒負責n臺伺服器訪問任務 去動態訪問各伺服器上的webservice的指定方法.然後對異常資訊進行報警.動態訪問webservic...

STM SETIMAGE引起的gdi記憶體洩露

最近給程式加了乙個動畫功能後,發現程式會引起及其嚴重的記憶體洩露,找了半天發現是呼叫stm setimage引起的。素以在此將使用stm setimage遇到的問題記錄一下。我的程式將動畫的所有幀提前載入後用定時器迴圈用stm setimage把點陣圖控制代碼傳送到視窗顯示,發現沒顯示一次就洩露好幾...