IOS CPU資源消耗原因和解決方案

2021-08-20 16:26:16 字數 1407 閱讀 7184

ios cpu資源消耗原因和解決方案

1.物件建立.

物件的建立會分配記憶體、調整屬性、甚至還有讀取檔案等操作,比較消耗 cpu 資源。盡量用輕量的物件代替重量的物件,可以對效能有所優化。比如 calayer 比 uiview 要輕量許多,那麼不需要響應觸控事件的控制項,用 calayer 顯示會更加合適。如果物件不涉及 ui 操作,則盡量放到後台執行緒去建立,但可惜的是包含有 calayer 的控制項,都只能在主線程建立和操作。通過 storyboard 建立檢視物件時,其資源消耗會比直接通過**建立物件要大非常多,在效能敏感的介面裡,storyboard 並不是乙個好的技術選擇。

盡量推遲物件建立的時間,並把物件的建立分散到多個任務中去。儘管這實現起來比較麻煩,並且帶來的優勢並不多,但如果有能力做,還是要盡量嘗試一下。如果物件可以復用,並且復用的代價比釋放、建立新物件要小,那麼這類物件應當盡量放到乙個快取池裡復用。

2.物件調整

物件的調整也經常是消耗 cpu 資源的地方。這裡特別說一下 calayer:calayer 內部並沒有屬性,當呼叫屬性方法時,它內部是通過執行時 resolveinstancemethod 為物件臨時新增乙個方法,並把對應屬性值儲存到內部的乙個 dictionary 裡,同時還會通知 delegate、建立動畫等等,非常消耗資源。uiview 的關於顯示相關的屬性(比如 frame/bounds/transform)等實際上都是 calayer 屬性對映來的,所以對 uiview 的這些屬性進行調整時,消耗的資源要遠大於一般的屬性。對此你在應用中,應該儘量減少不必要的屬性修改。

當檢視層次調整時,uiview、calayer 之間會出現很多方法呼叫與通知,所以在優化效能時,應該盡量避免調整檢視層次、新增和移除檢視。

3.物件銷毀

物件的銷毀雖然消耗資源不多,但累積起來也是不容忽視的。通常當容器類持有大量物件時,其銷毀時的資源消耗就非常明顯。同樣的,如果物件可以放到後台執行緒去釋放,那就挪到後台執行緒去。這裡有個小 tip:把物件捕獲到 block 中,然後扔到後台佇列去隨便傳送個訊息以避免編譯器警告,就可以讓物件在後台執行緒銷毀了。

4.布局計算

不論通過何種技術對檢視進行布局,其最終都會落到對 uiview.frame/bounds/center 等屬性的調整上。上面也說過,對這些屬性的調整非常消耗資源,所以盡量提前計算好布局,在需要時一次性調整好對應屬性,而不要多次、頻繁的計算和調整這些屬性.

autolayout 是蘋果本身提倡的技術,在大部分情況下也能很好的提公升開發效率,但是 autolayout 對於複雜檢視來說常常會產生嚴重的效能問題。隨著檢視數量的增長,autolayout 帶來的 cpu 消耗會呈指數級上公升。具體資料可以看這個文章: 如果你不想手動調整 frame 等屬性,你可以用一些工具方法替代(比如常見的 left/right/top/bottom/width/height 快捷屬性),或者使用 componentkit、asyncdisplaykit 等框架。

CPU 資源消耗原因和解決方案

1 物件建立 物件的建立會分配記憶體 調整屬性 甚至還有讀取檔案等操作,比較消耗 cpu 資源。盡量用輕量的物件代替重量的物件,可以對效能有所優化。比如 calayer 比 uiview 要輕量許多,那麼不需要響應觸控事件的控制項,用 calayer 顯示會更加合適。如果物件不涉及 ui 操作,則盡...

死鎖原因,條件和解決

死鎖是指多個程序迴圈等待彼此占有的資源而無限期的僵持等待下去的局面。原因是 為使系統不發生死鎖,必須設法破壞產生死鎖的四個必要條件之一,或者允許死鎖產生,但當死鎖發生時能檢測出思索,並有能力實現恢復。一般有死鎖的預防 死鎖避免 死鎖的檢測與恢復三種方法。允許程序動態的申請資源,但系統在進行資源分配前...

android ANR產生原因和解決辦法

預設情況下,在android中activity的最長執行時間是5秒,broadcastreceiver的最長執行時間則是10秒。第一 什麼會引發anr?在android裡,應用程式的響應性是由activity manager和windowmanager系統服務監視的 當它監測到以下情況中的乙個時,a...