最近一直在做公司app內(nèi)存優(yōu)化相關(guān)事宜,排查別人的代碼,也能給自己一些警示。現(xiàn)在整理出一些內(nèi)存管理出的問題,希望能幫助到大家。
問題1:多個頁面無法成功dealloc,內(nèi)存沒有被釋放
解決步驟:在viewDidDisAppear中,發(fā)現(xiàn)retainCount為6,證明此時這個ViewController還存在引用計數(shù),查了各種self的引用之后,萬萬沒想到,十幾個地方都這樣:

1.png
還記得我寫的這篇文章么:記今天調(diào)試了一條迷の閃退問題。一開始我以為是delegate的問題,但是萬萬沒想到...
當時自己一個不注意坑了自己,這回被同事坑了。這邊代碼是個不主做iOS方向的同事寫的,OC的默認類型是atomic , strong , readwrite,然而他并不知道。
問題原因:內(nèi)存不被釋放主要是self被delegate強引用了。由此還造成了一部分閃退問題,因為大部分通知的注銷都寫在dealloc中,所以通知無法注銷,導致各種調(diào)用滿天飛,畫面太美不敢看。
問題2:某頁面成功dealloc,但是仍有內(nèi)存殘留
解決步驟:instrument調(diào)試后,發(fā)現(xiàn)沒被釋放的全是imageIO,差不多就知道了,把讀圖的方式,從[UIImage imageNamed:@""],改成imageWithContentsOfFile,就可以了。

2.png
問題原因:imageNamed讀取圖片的方法,會緩存在內(nèi)存中,所以較大的圖片,還是用imageWithContentsOfFile。
TIPs1:.xcassets里的圖片無法用imageWithContentsOfFile讀取;
TIPs2:imageWithContentsOfFile讀取圖片需要加文件后綴名如png,jpg等;
問題3:圖片讀取總是出現(xiàn)迷之內(nèi)存殘留
解決步驟:
這個問題找了我很久,發(fā)現(xiàn)每次讀緩存(memory)的時候都不會有內(nèi)存增加,而從磁盤(disk)讀取的時候,就會有問題。然后我就一步一步排查。最后在block里發(fā)現(xiàn)了這個:

3.png
寫這段代碼的出來我們聊聊人生。
"( *?ω?)?╰ひ╯
問題原因:block里沒有使用弱引用,導致一直持有self得不到釋放。
TIPs:block引用self要慎重,如果self釋放后仍有業(yè)務邏輯要在block中運行,可以再對weakSelf強引用一下。
問題4:使用GPUImage處理拍照的時候,內(nèi)存穩(wěn)定不明增長。
問題原因:
是Xcode7.1的問題。。只在debug的時候?qū)е聝?nèi)存崩潰,release的時候并不會造成內(nèi)存溢出,所以可以不必管它。
原文鏈接:http://www.itdecent.cn/p/ef52250df748
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標注“簡書作者”。