最近項(xiàng)目中有截屏分享的需求,截取整個(gè)uitableview的contentview颠放,然后分享岖是。
截屏的思路是分段截取轴咱,網(wǎng)上搜了有人給的方法是將uitableview的frame設(shè)置成contentsize大小,鋪開(kāi)之后一次性render剪廉,但是這樣可以想象如果tableview太長(zhǎng)邑雅,內(nèi)存肯定要崩,而且鋪開(kāi)tableview之后妈经,cell的重用機(jī)制就失效了淮野,想想要初始化多少個(gè)cell來(lái)展示所有數(shù)據(jù)。因此最好是分屏截取吹泡,截一張骤星,保存在本地,然后截取滾動(dòng)到下一塊爆哑。依次全部截取完成之后洞难,再把所有圖片拼接起來(lái)。
但是調(diào)試過(guò)程中發(fā)現(xiàn)內(nèi)存仍然會(huì)暴增揭朝,每截一次圖队贱,內(nèi)存就會(huì)增加一節(jié),并且不會(huì)回落潭袱。instrument調(diào)試發(fā)現(xiàn)所有內(nèi)存的增加都是叫一個(gè)VM:CG raster data 的對(duì)象
網(wǎng)上各種查柱嫌,大部分講的都是sdwebimage的問(wèn)題,的確屯换,sdwebimage為了加快圖片載入速度编丘,默認(rèn)開(kāi)啟了使用內(nèi)存來(lái)緩存圖片信息,如果發(fā)現(xiàn)在滾動(dòng)tableview時(shí)內(nèi)存暴增彤悔,可能是因?yàn)檫@個(gè)原因嘉抓,關(guān)閉這個(gè)選項(xiàng)即可:
sd也給出了說(shuō)明:
但是截圖過(guò)程中,如果只是簡(jiǎn)單的從context中獲取圖片的代碼晕窑,發(fā)現(xiàn)也會(huì)導(dǎo)致內(nèi)存暴增抑片,就要考慮其他原因了:
instrument表現(xiàn)內(nèi)存增加如下:
會(huì)發(fā)現(xiàn),多次截圖杨赤,內(nèi)存穩(wěn)步遞增敞斋,cgrasterdata對(duì)象生成的個(gè)數(shù)跟全部個(gè)數(shù)相等级遭,意味著之前生成的全部沒(méi)有釋放掉。點(diǎn)擊右側(cè)箭頭進(jìn)入渺尘,會(huì)發(fā)現(xiàn)所有的對(duì)象產(chǎn)生的地方都是相同的:
雙擊進(jìn)入代碼挫鸽,會(huì)發(fā)現(xiàn)對(duì)象初始化的地方在:
UIImage*image =UIGraphicsGetImageFromCurrentImageContext();
這一行,也就是說(shuō)該對(duì)象實(shí)在生成image的時(shí)候產(chǎn)生的鸥跟。未釋放的原因就可能是dealloc出問(wèn)題了
經(jīng)過(guò)各種demo排查丢郊,發(fā)現(xiàn)是我在uiimage的分類中重寫了dealloc方法。医咨。枫匾。用來(lái)釋放運(yùn)行時(shí)動(dòng)態(tài)添加的屬性。刪掉dealloc方法后正常拟淮。因此干茉,在分類中千萬(wàn)要小心替換系統(tǒng)的方法,如果重寫了要注意調(diào)回被你替換調(diào)的系統(tǒng)方法很泊,因?yàn)榉诸惻c繼承不同角虫,繼承可以調(diào)super去調(diào)父類的方法,分類的話就是完全覆蓋了分類的方法委造。分類里方法的命名也盡量帶上自己的前綴戳鹅,因?yàn)椴荒鼙WC某個(gè)版本里面就可能會(huì)出現(xiàn)新的方法與自己的方法同名
如果有時(shí)候一定要在分類中重寫系統(tǒng)的方法(尤其是dealloc最經(jīng)常,需要釋放一些資源)可以參考下面的寫法:
原理:load時(shí)通過(guò)運(yùn)行時(shí)交換dealloc與customdealloc的實(shí)現(xiàn)昏兆,這樣系統(tǒng)調(diào)用dealloc時(shí)會(huì)調(diào)用到我們自定義的實(shí)現(xiàn)里枫虏,而在自定義的實(shí)現(xiàn)里重新用performselector去調(diào)用customdealloc的方法,因?yàn)橐呀?jīng)叫喚過(guò)爬虱,會(huì)調(diào)用到系統(tǒng)的dealloc的實(shí)現(xiàn)隶债,從而實(shí)現(xiàn)在不覆蓋系統(tǒng)方法的情況下添加自定義的操作
以上純屬個(gè)人猜測(cè)與實(shí)踐,使用之后解決了uiimage無(wú)法釋放的問(wèn)題跑筝。至于有沒(méi)有其問(wèn)題還么發(fā)現(xiàn)死讹,希望小伙伴們發(fā)現(xiàn)了的話及時(shí)留言告知,可以一起探索继蜡,謝謝~~
第一次寫文章哎回俐!ios菜鳥(niǎo)一枚,寫的不好請(qǐng)見(jiàn)諒~~