最近一直在做公司app內(nèi)存優(yōu)化相關(guān)事宜耿导,排查別人的代碼声怔,也能給自己一些警示。現(xiàn)在整理出一些內(nèi)存管理出的問題碎节,希望能幫助到大家捧搞。
問題1:多個(gè)頁面無法成功dealloc,內(nèi)存沒有被釋放
解決步驟:在viewDidDisAppear中狮荔,發(fā)現(xiàn)retainCount為6胎撇,證明此時(shí)這個(gè)ViewController還存在引用計(jì)數(shù),查了各種self的引用之后殖氏,萬萬沒想到晚树,十幾個(gè)地方都這樣:
還記得我寫的這篇文章么:記今天調(diào)試了一條迷の閃退問題。一開始我以為是delegate的問題雅采,但是萬萬沒想到...
當(dāng)時(shí)自己一個(gè)不注意坑了自己爵憎,這回被同事坑了。這邊代碼是個(gè)不主做iOS方向的同事寫的婚瓜,OC的默認(rèn)類型是atomic , strong , readwrite宝鼓,然而他并不知道。
問題原因:內(nèi)存不被釋放主要是self被delegate強(qiáng)引用了巴刻。由此還造成了一部分閃退問題愚铡,因?yàn)榇蟛糠滞ㄖ淖N都寫在dealloc中,所以通知無法注銷胡陪,導(dǎo)致各種調(diào)用滿天飛沥寥,畫面太美不敢看。
問題2:某頁面成功dealloc柠座,但是仍有內(nèi)存殘留
解決步驟:instrument調(diào)試后邑雅,發(fā)現(xiàn)沒被釋放的全是imageIO,差不多就知道了妈经,把讀圖的方式淮野,從[UIImage imageNamed:@""],改成imageWithContentsOfFile捧书,就可以了。
問題原因:imageNamed讀取圖片的方法骤星,會緩存在內(nèi)存中鳄厌,所以較大的圖片,還是用imageWithContentsOfFile妈踊。
TIPs1:.xcassets里的圖片無法用imageWithContentsOfFile讀取泪漂;
TIPs2:imageWithContentsOfFile讀取圖片需要加文件后綴名如png廊营,jpg等;
問題3:圖片讀取總是出現(xiàn)迷之內(nèi)存殘留
解決步驟:
這個(gè)問題找了我很久萝勤,發(fā)現(xiàn)每次讀緩存(memory)的時(shí)候都不會有內(nèi)存增加露筒,而從磁盤(disk)讀取的時(shí)候,就會有問題敌卓。然后我就一步一步排查慎式。最后在block里發(fā)現(xiàn)了這個(gè):
寫這段代碼的出來我們聊聊人生。
"( *?ω?)?╰ひ╯
問題原因:block里沒有使用弱引用趟径,導(dǎo)致一直持有self得不到釋放瘪吏。
TIPs:block引用self要慎重,如果self釋放后仍有業(yè)務(wù)邏輯要在block中運(yùn)行蜗巧,可以再對weakSelf強(qiáng)引用一下掌眠。
問題4:使用GPUImage處理拍照的時(shí)候,內(nèi)存穩(wěn)定不明增長幕屹。
問題原因:
喵神之前在博客發(fā)的一個(gè)問題
是Xcode7.1的問題蓝丙。。只在debug的時(shí)候?qū)е聝?nèi)存崩潰望拖,release的時(shí)候并不會造成內(nèi)存溢出渺尘,所以可以不必管它。
簡書已經(jīng)棄用说敏,歡迎移步我的小專欄:
https://xiaozhuanlan.com/dahuihuiiOS
如果對你有用鸥跟,點(diǎn)個(gè)喜歡唄~你們的喜歡是我寫文的最大動力么么扎