跳到主要內容

發表文章

目前顯示的是 9月, 2018的文章

iOS 性能優化

source: https://juejin.im/post/5b7a9c466fb9a019eb43b0d5 卡頓優化 -CPU  盡量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用CALayer取代UIView 不要頻繁地調用UIView的相關屬性,比如frame、bounds、transform等屬性,盡量減少不必要的修改  盡量提前計算好佈局,在有需要時一次性調整對應的屬性,不要多次修改屬性  Autolayout會比直接設置frame消耗更多的CPU資源  圖片的size最好剛好跟UIImageView的size保持一致  控制一下線程的最大並發數量  盡量把耗時的操作放到子線程 卡頓優化 -GPU  盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示  盡量減少視圖數量和層次  減少透明的視圖(alpha 盡量避免出現離屏渲染 離屏渲染  在OpenGL中,GPU有2種渲染方式  On-Screen Rendering:當前屏幕渲染,在當前用於顯示的屏幕緩衝區進行渲染操作  Off-Screen Rendering:離屏渲染,在當前屏幕緩衝區以外新開闢一個緩衝區進行渲染操作  離屏渲染消耗性能的原因  需要創建新的緩衝區  離屏渲染的整個過程,需要多次切換上下文環境,先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束以後,將離屏緩衝區的渲染結果顯示到屏幕上,又需要將上下文環境從離屏切換到當前屏幕  哪些操作會觸發離屏渲染?  光柵化,layer.shouldRasterize = YES  遮罩,layer.mask  圓角,同時設置layer.masksToBounds = YES、layer.cornerRadius大於0 考慮通過CoreGraphics繪製裁剪圓角,或者叫美工提供圓角圖片  陰影,layer.shadowXXX 如果設置了layer.shadowPath就不會產生離屏渲染 優化方案...

優化記憶體管理

使用ARC 延遲加載懶加載 重用在正確的地方使用reuseIndentifier 緩存NSCache 保存計算數據 處理內存警告移除對緩存,圖片object 和其他一些可以重創建的objects 的強引用 5.1 app delegate 中使用`applicationDidReceiveMemoryWarning:` 的方法 5.2 自定義UIViewController 的子類(subclass)中覆蓋`didReceiveMemoryWarning` 5.3在自定義類中註冊並接收UIApplicationDidReceiveMemoryWarningNotification 的通知 重用大開銷對象NSDateFormatter和NSCalendar 懶加載/單例_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy”; 設置和創建速度一樣慢 自動釋放池手動添加自動釋放池 是否緩存圖片imageNamed imageWithContentOfFile 混編 循環引用delegate block nstimer 移除kvo nsnotificationcenter 並未強引用,只記錄內存地址,野指針報 UIViewController自動移除一般在dealloc中 performselector 延遲操作[NSObject cancelPreviousPerformRequestsWithTarget:self]

memory leak

1.打印殭屍對象,進行野指針的檢測   2.靜態檢測方法product->Analyze   3.動態檢測方法Build Setting -> Analyze During ‘Build’ ->Yes   4.xcode自帶工具instruments  5.dealloc 打印測試是否運行  6.第三方內存檢測工具 如:mleak

Block and copy

block也經常使用 copy 關鍵字,具體原因見官方文檔:Objects Use Properties to Keep Track of Blocks: block使用copy 是從MRC 遺留下來的“傳統”,在MRC 中,方法內部的block是在棧區的,使用copy 可以把它放到堆區.在ARC 中寫不寫都行:對於block使用copy還是strong 效果是一樣的,但寫上copy 也無傷大雅,還能時刻提醒我們:編譯器自動對block 進行了copy 操作。 如果不寫 copy ,該類的調用者有可能會忘記或者根本不知道“編譯器會自動對block進行了 copy 操作”,他們有可能會在調用之前自行拷貝屬性值。這種操作多餘而低效。