最近一直在做公司app內(nèi)存優(yōu)化相關(guān)事宜,排查別人的代碼雕崩,也能給自己一些警示。現(xiàn)在整理出一些內(nèi)存管理出的問(wèn)題融撞,希望能幫助到大家盼铁。
問(wèn)題1:多個(gè)頁(yè)面無(wú)法成功dealloc,內(nèi)存沒(méi)有被釋放
解決步驟:在viewDidDisAppear中懦铺,發(fā)現(xiàn)retainCount為6捉貌,證明此時(shí)這個(gè)ViewController還存在引用計(jì)數(shù)支鸡,查了各種self的引用之后冬念,萬(wàn)萬(wàn)沒(méi)想到,十幾個(gè)地方都這樣:
1.png
還記得我寫(xiě)的這篇文章么:記今天調(diào)試了一條迷の閃退問(wèn)題牧挣。一開(kāi)始我以為是delegate的問(wèn)題急前,但是萬(wàn)萬(wàn)沒(méi)想到...
當(dāng)時(shí)自己一個(gè)不注意坑了自己,這回被同事坑了瀑构。這邊代碼是個(gè)不主做iOS方向的同事寫(xiě)的裆针,OC的默認(rèn)類型是atomic , strong , readwrite,然而他并不知道寺晌。
問(wèn)題原因:內(nèi)存不被釋放主要是self被delegate強(qiáng)引用了世吨。由此還造成了一部分閃退問(wèn)題,因?yàn)榇蟛糠滞ㄖ淖N都寫(xiě)在dealloc中呻征,所以通知無(wú)法注銷耘婚,導(dǎo)致各種調(diào)用滿天飛,畫(huà)面太美不敢看陆赋。
問(wèn)題2:某頁(yè)面成功dealloc沐祷,但是仍有內(nèi)存殘留
解決步驟:instrument調(diào)試后,發(fā)現(xiàn)沒(méi)被釋放的全是imageIO攒岛,差不多就知道了赖临,把讀圖的方式,從[UIImage imageNamed:@""],改成imageWithContentsOfFile灾锯,就可以了兢榨。
2.png
問(wèn)題原因:imageNamed讀取圖片的方法,會(huì)緩存在內(nèi)存中顺饮,所以較大的圖片吵聪,還是用imageWithContentsOfFile。
TIPs1:.xcassets里的圖片無(wú)法用imageWithContentsOfFile讀攘焱弧暖璧;
TIPs2:imageWithContentsOfFile讀取圖片需要加文件后綴名如png,jpg等君旦;
問(wèn)題3:圖片讀取總是出現(xiàn)迷之內(nèi)存殘留
解決步驟:
這個(gè)問(wèn)題找了我很久澎办,發(fā)現(xiàn)每次讀緩存(memory)的時(shí)候都不會(huì)有內(nèi)存增加嘲碱,而從磁盤(pán)(disk)讀取的時(shí)候,就會(huì)有問(wèn)題局蚀。然后我就一步一步排查麦锯。最后在block里發(fā)現(xiàn)了這個(gè):
3.png
寫(xiě)這段代碼的出來(lái)我們聊聊人生。
"( *?ω?)?╰ひ╯
問(wèn)題原因:block里沒(méi)有使用弱引用琅绅,導(dǎo)致一直持有self得不到釋放扶欣。
TIPs:block引用self要慎重,如果self釋放后仍有業(yè)務(wù)邏輯要在block中運(yùn)行千扶,可以再對(duì)weakSelf強(qiáng)引用一下料祠。
問(wèn)題4:使用GPUImage處理拍照的時(shí)候,內(nèi)存穩(wěn)定不明增長(zhǎng)澎羞。
問(wèn)題原因:
是Xcode7.1的問(wèn)題髓绽。。只在debug的時(shí)候?qū)е聝?nèi)存崩潰妆绞,release的時(shí)候并不會(huì)造成內(nèi)存溢出顺呕,所以可以不必管它。
原文鏈接:http://www.reibang.com/p/ef52250df748
著作權(quán)歸作者所有括饶,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)株茶,并標(biāo)注“簡(jiǎn)書(shū)作者”。