從搜集的數(shù)據(jù)中分析內(nèi)存中存在的問題
- 搜集數(shù)據(jù)
這里因為篇幅問題暫時只介紹一種打開Allocatons的方法燥透,首先在真機上運行app。
在DebugNavigation
上面選在Memory
,可以看到大概的內(nèi)存情況肢藐,再點擊Profile in Instruments
進入Allocations頁面吆豹。
先看Detail pane
這里是收集到得數(shù)據(jù)痘煤,下面我們要從這里分析出哪里出問題了衷快。
先介紹幾個概念蘸拔。
Persistent
:該對象存在于內(nèi)存中的個數(shù)
Transient
:存在過已經(jīng)被回收的對象的個數(shù)
Persistent Byte
:該類對象在內(nèi)存中占得總內(nèi)存
Growth
:增加的內(nèi)存
接下來看看這些數(shù)據(jù),選擇Statistics統(tǒng)計
调窍,這些數(shù)據(jù)的排列是按照所占內(nèi)存的大小张遭,從高到低排列下來的帝璧。
第一種方法
現(xiàn)在介紹的這個找出問題的方法的烁,建立在你大概可以感覺到哪個地方出錯了渴庆。不然你就得,看這里大量的數(shù)據(jù)刃滓,從中找出感覺不對勁的咧虎。下面的一種方法會介紹從宏觀的角度去找問題砰诵。
看這個類,目前在內(nèi)存中只有1個(它是一個cell,該類型的cell茁彭,在數(shù)據(jù)源里面只有一個),然后我會不停的在這個頁面和其他頁面之間切換扶歪。
切換之后
//這里變成了10理肺,正確的應(yīng)該只有一個的?善镰?
選中灰色箭頭
到這里
選中其中之一妹萨,在詳情擴展區(qū)域(Extended Deatil Area)選擇,Extended媳禁,
到這里眠副,
可見這里的cell沒有重用竣稽,每次都會創(chuàng)建一個
然后把它換成這樣囱怕,就ok了
第二種方法
第一步,觀察內(nèi)存的graph毫别,看看有沒有哪里是異常的娃弓。
下面是我三進三出,一個頁面所出現(xiàn)的內(nèi)存曲線
可以看到內(nèi)存在遞增.岛宦。然后我將會打點台丛,對就是打點,在進頁面和出頁面的時候分別打點砾肺,也就是6個點挽霉。來觀察不同時間內(nèi),是哪些數(shù)據(jù)的內(nèi)存異常增加(Unbounded memory growth)
在詳情面板变汪,選擇
Generation
(1)侠坎,然后再Extended Detail Area
(2)區(qū)域選擇DisPlay Settings
,每次要打點時按MarkGeneration
(3)裙盾,在圖形區(qū)域就會出現(xiàn)一個紅色的小旗子(4),6個點分別命名A实胸、B他嫡、C、D庐完、E钢属、F(5)
然后分析數(shù)據(jù)
看Growth,從0-12.16M
门躯、17.96k-2.24M
淆党、8.09k-2.48M
,可見每次進入目標頁面生音,內(nèi)存就會增加幾兆宁否,第一次更多,為什么缀遍,是什么占用了這么多內(nèi)存慕匠。
點看B,請看這里內(nèi)存占用最多的是和圖形和動畫相關(guān)的域醇,SVProgressHUD台谊,CoreUI Image,CoreAnimation
第一次增加的特別多什么呢譬挚,再看D
在A里面排列前幾的都沒了锅铅,推測可能是因為有緩存
占有最多的是,每次進入頁面的刷新組件的頭部减宣,頭部是有動畫效果的盐须,所以比較耗內(nèi)存。
如何運用第二種方法
先在各個頁面劃一劃漆腌,看看總體的內(nèi)存情況贼邓,如果發(fā)現(xiàn)有異常的內(nèi)存曲線,就多次打點闷尿,取數(shù)據(jù)分析塑径。
Tips:多次進入同一個頁面內(nèi)存會緩慢上升,不要急填具,這是緩存统舀,只要按home鍵退到后臺就降下來了