一. 靜態(tài)內存分析
-
所謂靜態(tài)內存分析, 是指在程序沒運行的時候, 通過工具對代碼直接進行分析
- 根據代碼的上下文的語法結構, 讓編譯器分析內存情況, 檢查是否有內存泄露
-
作用
- 邏輯錯誤: 訪問未初始化的變量或者野指針
- 聲明錯誤: 聲明了一個對象, 但是從未使用過
- 內存管理錯誤: 內存泄露
- 缺點: 靜態(tài)內存分析由于是編譯器根據代碼進行的判斷, 做出的判斷不一定會準確, 因此如果遇到提示, 應該去結合代碼上文檢查一下
-
OC中的靜態(tài)內存分析:
- 曾經在MRC環(huán)境下, OC的代碼需要手動管理內存, 任何對象的引用, 都要伴隨一次release操作, 否則很容易發(fā)生內存泄露, 因此在MRC環(huán)境下, 使用靜態(tài)內存分析很有必要
- 而在目前的ARC環(huán)境下, 很少會發(fā)生內存泄露, 但是也會有很少數(shù)的情況導致內存泄露
- 如Foundation對象與CoreFoundation對象的相互轉化, CoreFoundation對象享用ARC機制, 所以容易發(fā)生內存泄露
-
Swift的靜態(tài)內存分析
- Swift中, 使用了類型重映射機制, 他可以將對象轉換成能夠自動管理內存的對象, 不需要我們手動釋放, 因此Swift在內存管理方面更為安全
二. 內存分配
-
作用
- 查看當前運行情況的內存分配
- 查看使用過的內存有沒有釋放掉
-
關于App中加載圖片的注意點
-
-imageNamed:
該方法用于加載小圖片/使用頻率高的圖片
此方法加載過得圖片, 在App運行期間, 始終會保有緩存, 這個緩存是由系統(tǒng)管理的, 無法通過代碼銷毀緩存
-
當系統(tǒng)察覺到內存消耗過高, 就會自動釋放這部分內存
Search for an object whose name was set explicitly using the setName: method and currently resides in the image cache. 該方法首先會從圖片內存中查找 Search the app's main bundle for a file whose name matches the specified string. 如果沒有找到, 就在App的mainBundle中查找 Search the Application Kit framework for a shared image with the specified name. 如果bundle中也沒有, 就會去framework的庫中尋找
-
-imageWithContentsOfFile:
- 該方法用于加載大圖片/使用率較低的圖片
- 它只是加載一次圖片, 并且不會做緩存, 當對象釋放的時候, 內存也就被釋放掉了
- 因此對于不常用的圖片應該使用這個方法
-
-
圖片在沙盒中的存在形式
- 如果當前項目部署版本 <= 6.x: 那么所有圖片就會直接暴露在沙盒的資源包中(main bundle), 不會進行壓縮為Assets.car文件
- 如果當前項目部署版本 >= 7.x
- 放在Images.xcassets中的所有圖片, 都會被壓縮為Assets.car文件, 不會直接暴露在沙盒的資源包中
- 而沒有放在Images.xcassets的圖片, 會直接暴露在沙盒的資源包中
- 使用對比
- 壓縮為Assets.car的文件:
- 這些圖片不會暴露在外, 但是無法或得到這些圖片的路徑, 只能通過圖片名-imageName來加載圖片, 并且會產生緩存
- 小圖片/使用頻率高, 放在image.xcassets中
- 未壓縮的圖片:
- 圖片暴露在外, 可以通過imageWithContentOfFile來獲得圖片的路徑, 不會有緩存
- 大圖片/使用頻率低, 如新特性界面, 放在外面
- 壓縮為Assets.car的文件:
-
補充一個獲取car中圖片的方法