最近一直在做視頻的東西,記錄下開發過程中遇到的坑和解決辦法。
我們關于視頻播放的模塊有下載下來觀看和線上觀看兩種,開始我是直接建了一個視頻播放的view,這兩種都用了這個view。關于視頻播放的具體方法這里就不多贅述了。
功能做好后發現線上播放的時候關閉viewcontroller后視頻播放的view沒有走dealloc方法,其實ARC里不用太在意dealloc方法,但是如果有通知的話還是最好在這個方法里移除,我這個view里就有通知(做過視頻播放的應該都知道需要實現監聽系統通知)。
經過一番打斷點后發現下載下來看的走了dealloc,而在線看的沒有走,于是我就開始各種嘗試,終于發現是給AVplayeritem添加KVO監聽status導致的問題,但是這個又是必須監聽的,于是查找dealloc方法為什么不調用(此處不深究),原因竟然是我的block里用的_全局變量而不是self.調用 ,代碼規范一定不能忽視,不然會出現很多讓你沒有頭緒的bug。
走了dealloc方法以為就ok了,但是走完就崩了,設置了全局斷點卻依然崩在了main函數里,哭暈。
幾分鐘后意識到可能要開啟僵尸模式(edit scheme中diagnotics的memory management勾選zombie object)。果然開啟后給了崩潰原因[(視頻播放view)class retain]: message sent to deallocated instance 0x11371b9e0 一番百度后說是過度釋放導致的,但是viewcontroller中的dealloc中顯示這個view的引用計數是2,只能想想別的辦法,仔細看了代碼后懷疑是這個view的hidden屬性問題,于是我就改成了alpha,改完后在我iOS11.3的系統上還真不閃退了,竊喜。開心過后想到測試機8.3的系統不知道運行有沒有問題,試了后果然又崩了,內心是崩潰的。。。
iOS8.3崩潰還連崩潰原因都不給了,真的是給Xcode跪了,苦思冥想后決定把全局斷點去掉看看效果,去掉后果然給了崩潰原因
An instance of class AVPlayerItem was deallocated while key value observers were still 。。。
這個好像說的是kvo沒有移除的原因,然后果斷在dealloc里移除了kvo。
至此終于解決了這個困擾好幾天的問題。