硬盤-->內存-->CPU
內存泄露
- 靜態內存分析
靜態內存分析是不運行程序,直接對代碼進行分析.
但是沒有真正分配內存,根據代碼的上下文的語法結構,來分析是否有內存泄露
缺點:不一定準確,但是如果發現有提示,那么去結合上下文看一下,這里的代碼是否有問題
快捷鍵:command +shift +b
進行方式:Product -- > Analyze
2.imageName和imageWithContentOfFile
imageName:加載圖片
1.當對象銷毀,圖片對象不會隨著一起銷毀
2.加載的圖片占據的內存較大:9.48
3.相同的圖片只會加載一份到內存中,如果同時使用,使用同一個對象即可
imageWithContentOfFile:加載圖片
1.當對象銷毀的時候,圖形對象會隨著一起銷毀
2.加載的圖片,占據的內存較小:6.25
3.相同的圖片會多次加載到內存中,如果同時使用圖片,使用的是不同的對象
總結:
imageName:如果一些圖片在多個界面都會使用,并且圖片較小,使用頻率高.(圖標/小的背景圖)
imageWithContentOfFile:只在一個地方使用,并且圖片較大,使用頻率不高.(版本新特性/相冊)
3.動態內存分析
優點:真正運行起來的程序,并且可以對某一個操作來具體分析,當用戶做了某一個操作時,該操作是否產生了內存泄露(分廠準確,如果提示有內存泄露,基本可以說明代碼有問題)
缺點:分析速度非常慢,需要一步一步來分析代碼是否有問題,切可能在分析過程中有遺漏代碼。
進行方式:Product --> Profile -->Leaks --> 選擇想要運行的項目 --> Record
這樣就可以開始動態檢測一個項目是否存在內存泄露了。
注意:我們需要進行操作讓系統不斷去執行所要檢測的代碼是否存在內存泄露。
如果有內存泄露會出現這樣的情況,由于筆者的 Xcode 是7.0 版本所以和 6.x 有所不同,但是使用是一樣的,我們點擊 Leak Checks 就能看到 Instrument 給出的提示。如果直接點擊會左邊的 Leaked Object 會進入匯編的提示環境。
這里我們在右側 Stack Trace 攔下點擊我們所創建的方法,也就是帶人像的方法,這樣就能定位到泄露的位置了。
之后點擊右上角 Xcode 的圖標直接回到 Xcode 代碼中進行修改,這樣我們動態內存分析就完成了。
注意:我們可能會看到這樣的情況, All Heap Allocations 是程序真實的內存分配情況,All Anonymous VM則是系統為程序分配的虛擬內存,為的就是當程序有需要的時候,能夠及時為程序提供足夠的內存空間,而不會現用現創建。