我廠的App長(zhǎng)時(shí)間使用后钩乍,有閃退的情況發(fā)生,估計(jì)是有內(nèi)存泄露導(dǎo)致App被系統(tǒng)殺死怔锌。用Instruments查看后發(fā)現(xiàn)的確有內(nèi)存泄露發(fā)生寥粹。
第一處如下圖:
這是因?yàn)槭褂昧说谌揭曨l播放SDK造成的,原因不明埃元。暫時(shí)擱置
更新:這個(gè)是因?yàn)椴シ诺囊曨l文件格式為.mp4涝涤,AVPlayer播放的時(shí)候就內(nèi)存泄露,懷疑是視頻文件本身有問題岛杀,嘗試使用Quicktime轉(zhuǎn)換為.mov時(shí)阔拳,發(fā)生錯(cuò)誤,不能轉(zhuǎn)換成功类嗤。后面將.mp4改為.mov格式糊肠,內(nèi)存泄露消失。
真正詭異的內(nèi)存泄露如下圖:
所有泄露都是發(fā)生在系統(tǒng)框架遗锣。我直接就懵逼了货裹,google了一圈,發(fā)現(xiàn)很早之前Apple系統(tǒng)框架的確有內(nèi)存泄露精偿,但都好多年了弧圆,早應(yīng)該修復(fù)了啊。
回到我們的App笔咽,排查到內(nèi)存泄露的地方搔预,發(fā)現(xiàn)代碼沒有問題。就是很多個(gè)UILabel顯示而已叶组,再仔細(xì)看內(nèi)存泄露的截圖拯田,發(fā)現(xiàn)很多泄露都和attributedstring有關(guān)系,但代碼里面根本就沒有使用這個(gè)扶叉。最后在xib里面發(fā)現(xiàn)有部分UILabel設(shè)置了attribute屬性勿锅,如下圖:
而在實(shí)際代碼里面帕膜,根本沒有使用UILabel的attributedText屬性,都是直接賦值給text屬性溢十。將xib里面的UILabel的Attributed全部改為Plain后垮刹, 內(nèi)存泄露修改。
我猜測(cè):如果xib里面設(shè)置有attributeText张弛,而在代碼里面有沒有使用這個(gè)屬性荒典,那么就會(huì)造成內(nèi)存泄露。稍后我會(huì)測(cè)試一下吞鸭。
更新:又花了些時(shí)間來測(cè)試這個(gè)內(nèi)存泄露寺董,發(fā)現(xiàn)其實(shí)不完全是attributeText的問題,xib里面大概有10多個(gè)UILabel刻剥,有10個(gè)UILabel使用了attributeText遮咖,其中只有一個(gè)attributeText有問題,
如上圖所示造虏,我刪除標(biāo)為 1 的代碼后御吞,內(nèi)存泄露消失。但我發(fā)現(xiàn) 標(biāo)1 和 標(biāo)2 的代碼完全一樣漓藕,為什么不是 標(biāo)2 的代碼導(dǎo)致內(nèi)存泄露呢陶珠?而且類似 標(biāo)1 的代碼還存在好幾處。為什么不是其他類似代碼的問題呢享钞?
我已經(jīng)完全遭逼了揍诽!