一、思維導(dǎo)圖
1. 流暢性優(yōu)化(卡頓優(yōu)化)
流暢性優(yōu)化 (Smoothness Optimization)
├── 1.1 原理 (Principle)
│ ├── CPU(中央處理器):計算、布局、解碼、繪制
│ ├── GPU(圖形處理器):紋理渲染、合成
│ ├── 顯示流水線 (Display Pipeline)
│ │ ├── 幀緩沖區(qū) (Frame Buffer)
│ │ ├── 雙緩沖 (Double Buffering):前幀緩存 + 后幀緩存
│ │ ├── 垂直同步信號 (VSync):60FPS時每16.7ms觸發(fā)一次
│ │ └── 卡頓原因:CPU/GPU未在VSync前完成工作 → 丟幀 (Frame Drop)
├── 1.2 CPU優(yōu)化 (CPU Optimization)
│ ├── 對象輕量化:用 CALayer 代替 UIView(無事件處理時)
│ ├── 減少屬性頻繁修改:frame/bounds/transform 等
│ ├── 提前計算布局:一次性設(shè)置屬性
│ ├── Auto Layout vs frame:Auto Layout 更耗CPU(約束求解)
│ ├── 圖片處理:圖片尺寸與 UIImageView 一致,子線程解碼 (Decoding)
│ ├── 線程管理:控制最大并發(fā)數(shù) (Max Concurrency)
│ └── 耗時操作子線程化:文本計算排版、圖片解碼繪制
├── 1.3 GPU優(yōu)化 (GPU Optimization)
│ ├── 減少圖片數(shù)量:合并多張圖片為精靈圖 (Sprite Sheet / Atlas)
│ ├── 紋理尺寸:不超過4096x4096(避免CPU介入)
│ ├── 減少視圖層級和數(shù)量
│ ├── 不透明視圖:設(shè)置 opaque = YES
│ └── 避免離屏渲染 (Off-Screen Rendering)
├── 1.4 離屏渲染 (Off-Screen Rendering)
│ ├── 定義:在屏幕外緩沖區(qū)渲染,需要切換上下文
│ ├── 觸發(fā)條件:
│ │ ├── 光柵化 (Rasterization):`layer.shouldRasterize = YES`
│ │ ├── 遮罩 (Mask):`layer.mask`
│ │ ├── 圓角 + 裁剪:`layer.masksToBounds = YES` + `layer.cornerRadius > 0`
│ │ └── 陰影 (Shadow):`layer.shadowXXX`,未設(shè)置 `shadowPath`
│ ├── 優(yōu)化方案:
│ │ ├── 用 Core Graphics 繪制圓角或使用圓角圖片
│ │ ├── 陰影設(shè)置 `shadowPath`
│ │ ├── 慎用光柵化(僅靜態(tài)復(fù)雜視圖有利)
│ │ └── 避免同時設(shè)置透明和圓角
└── 1.5 卡頓檢測 (Stutter Detection)
├── 工具:Instruments(Time Profiler, Core Animation)、Xcode調(diào)試選項、第三方庫
└── 方法:RunLoop Observer監(jiān)聽主線程耗時
2. 耗電優(yōu)化
耗電優(yōu)化 (Battery Optimization)
├── 2.1 CPU/GPU功耗
│ ├── 少用定時器 (Timer)
│ ├── 降低計算量,優(yōu)化算法
├── 2.2 I/O優(yōu)化 (I/O Optimization)
│ ├── 減少小數(shù)據(jù)寫入:批量寫入
│ ├── 使用 `dispatch_io`:基于GCD的異步I/O
│ ├── 數(shù)據(jù)庫:SQLite / Core Data 批量操作
├── 2.3 網(wǎng)絡(luò)優(yōu)化 (Network Optimization)
│ ├── 壓縮數(shù)據(jù) (Compression)
│ ├── 緩存策略 (Caching)
│ ├── 斷點續(xù)傳 (Resumable Download)
│ ├── 合理超時,允許取消
│ ├── 批量傳輸 (Batch Transfer)
├── 2.4 定位優(yōu)化 (Location Optimization)
│ ├── 單次定位:`requestLocation`
│ ├── 降低精度,避免 `Best`
│ ├── 后臺定位:`pausesLocationUpdatesAutomatically = YES`
│ ├── 區(qū)域監(jiān)聽優(yōu)于顯著變化監(jiān)聽
└── 2.5 傳感器優(yōu)化 (Sensor Optimization)
├── 及時關(guān)閉加速度計、陀螺儀等
└── 降低采樣頻率
3. 啟動優(yōu)化
啟動優(yōu)化 (Launch Optimization)
├── 3.1 冷啟動 (Cold Launch) vs 熱啟動 (Warm Launch)
├── 3.2 啟動三個階段
│ ├── (1) dyld:加載可執(zhí)行文件和動態(tài)庫
│ ├── (2) runtime:加載類、分類、調(diào)用 +load 等
│ └── (3) main:UIApplicationMain 及 didFinishLaunching
├── 3.3 優(yōu)化措施
│ ├── dyld階段:減少動態(tài)庫、減少類/分類/Selector、多用 struct
│ ├── runtime階段:用 +initialize 和 dispatch_once 替代 +load
│ └── main階段:延遲加載、按需加載
├── 3.4 啟動耗時分析:DYLD_PRINT_STATISTICS,Instruments
└── 3.5 進階:二進制重排 (Binary Reordering)
├── 原理:將啟動函數(shù)集中,減少Page Fault
└── 實現(xiàn):order文件,Clang插樁
4. 安裝包瘦身
安裝包瘦身 (Package Slimming)
├── 4.1 資源瘦身
│ ├── 無損壓縮圖片 (ImageOptim, TinyPNG)
│ ├── 使用現(xiàn)代格式:WebP, HEIC
│ ├── 刪除無用資源:LSUnusedResources
│ └── 按需下載 (On-Demand Resources)
└── 4.2 可執(zhí)行文件瘦身
├── 編譯器優(yōu)化:Strip, Symbols Hidden, -fno-exceptions
├── 無用代碼檢測:AppCode, LLVM插件
├── LinkMap分析
└── 鏈接時優(yōu)化 (ThinLTO)
5. 監(jiān)控與工具
監(jiān)控與工具 (Monitoring & Tools)
├── 開發(fā)階段工具
│ ├── Instruments:Time Profiler, Core Animation, Leaks, Allocations, Energy Log
│ ├── Xcode調(diào)試選項:Color Blended Layers, Color Offscreen-Rendered, Color Misaligned Images
│ └── 第三方庫:MLeaksFinder, Matrix, GT
└── 線上監(jiān)控
├── 自定義監(jiān)控:基于RunLoop卡頓監(jiān)控、內(nèi)存水位監(jiān)控、啟動時間打點
├── MetricKit:系統(tǒng)級性能數(shù)據(jù)收集
└── 堆棧符號化服務(wù)
二、面試題及答案
題目1:你在項目中是怎么優(yōu)化內(nèi)存的?
專業(yè)答案
初級掌握
- 遵循 ARC 規(guī)則,避免循環(huán)引用(使用
weak、unowned)。 - 重用
UITableViewCell、UICollectionViewCell,避免頻繁創(chuàng)建新對象。 - 使用
@autoreleasepool管理循環(huán)內(nèi)大量臨時變量,及時釋放內(nèi)存。 - 在
viewDidDisappear或dealloc中將不需要的對象置nil。 - 利用 Xcode 的 Instruments 中的 Leaks 工具檢測內(nèi)存泄漏。
中級擴展
- 圖片內(nèi)存優(yōu)化:根據(jù)場景選擇
imageNamed:(系統(tǒng)緩存)或imageWithContentsOfFile:(無緩存);將圖片解碼放到子線程;使用ImageIO對圖片降采樣 (Downsampling) 生成縮略圖,避免加載原圖。 - 合理使用
NSCache管理可復(fù)用對象,設(shè)置成本限制和數(shù)量限制,并在內(nèi)存警告時自動清理。 - 對于大文件,使用
NSData的NSDataReadingMappedIfSafe選項,將文件映射到內(nèi)存,減少內(nèi)存占用。 - 利用
autoreleasepool優(yōu)化循環(huán)中產(chǎn)生的大量臨時對象。 - 使用 Instruments 的 Allocations 工具分析內(nèi)存分配峰值,定位大內(nèi)存占用。
高級深入
- 深入理解內(nèi)存分區(qū)(棧、堆、全局區(qū)、代碼段、Mapped 區(qū)域),使用
vm_statistics監(jiān)控虛擬內(nèi)存,分析內(nèi)存碎片。 - 采用
mmap實現(xiàn)大文件的讀寫,避免內(nèi)存拷貝,提升性能。 - 設(shè)計多級緩存架構(gòu):內(nèi)存緩存(
NSCache)、磁盤緩存(YYDiskCache),實現(xiàn) LRU 淘汰策略。 - 搭建自動化內(nèi)存泄漏檢測系統(tǒng),集成
MLeaksFinder,并結(jié)合 CI/CD 流水線,確保代碼質(zhì)量。 - 在團隊內(nèi)推廣使用 Swift 的
struct和enum代替部分class,減少堆分配,利用值類型優(yōu)化內(nèi)存。 - 使用 Instruments 的 VM Tracker 分析內(nèi)存區(qū)域,優(yōu)化內(nèi)存對齊,減少內(nèi)存碎片。
- 對 OOM(Out of Memory)問題進行深入分析,結(jié)合 jetsam 日志定位問題。
通俗解釋
內(nèi)存優(yōu)化就是讓 App 使用更少的內(nèi)存,避免占用太多導(dǎo)致系統(tǒng)殺后臺或自己崩潰。好比整理房間,及時扔掉不用的東西(釋放對象),把常用的東西放在好拿的地方(緩存),大件物品靠墻放(文件映射),就不會覺得擁擠。
題目2:優(yōu)化你是從哪幾方面著手的?
專業(yè)答案
初級掌握
- 流暢性:避免主線程卡頓,圖片異步加載,重用 cell。
- 耗電:減少不必要的計算和定位。
- 啟動時間:將非必要初始化延遲。
- 包大小:刪除無用圖片,壓縮資源。
中級擴展
- 從四個維度全面優(yōu)化:流暢性(CPU/GPU/離屏渲染)、耗電(I/O/網(wǎng)絡(luò)/定位/傳感器)、啟動(dyld/runtime/main)、包體積(資源/代碼瘦身)。
- 針對每個維度使用相應(yīng)工具分析(Instruments、LinkMap、環(huán)境變量等)。
- 結(jié)合業(yè)務(wù)場景,制定優(yōu)先級,先解決最影響體驗的問題。
高級深入
- 建立性能優(yōu)化體系:監(jiān)控、分析、優(yōu)化、回歸閉環(huán)。
- 從架構(gòu)層面入手,設(shè)計高性能組件(如異步渲染列表、模塊懶加載)。
- 探索底層優(yōu)化技術(shù):二進制重排、ThinLTO、LLVM 插件等。
- 推動團隊形成性能文化,編寫性能測試用例,自動化檢測性能劣化。
- 引入線上性能監(jiān)控平臺,實時掌握 App 性能表現(xiàn)。
通俗解釋
優(yōu)化就像給車做保養(yǎng),要從發(fā)動機(CPU/GPU)、油耗(耗電)、啟動速度(啟動時間)、車身重量(包大?。┤轿粰z查,找到短板針對性改進。
題目3:列表卡頓的原因可能有哪些?你平時是怎么優(yōu)化的?
專業(yè)答案
初級掌握
- 原因:主線程做耗時操作(圖片下載、復(fù)雜計算、文件讀寫);cell 視圖層級過多;離屏渲染(圓角、陰影);
reloadData頻繁調(diào)用。 - 優(yōu)化:圖片異步加載(
SDWebImage);設(shè)置 cell 的opaque = YES;減少視圖層級;緩存行高;避免在cellForRow中實時計算。
中級擴展
- 使用 Instruments Time Profiler 定位耗時函數(shù)。
- 提前計算并緩存行高(或使用自動布局緩存)。
- 將文本渲染、圖片解碼放到子線程(使用
dispatch_async)。 - 避免離屏渲染:用圓角圖片替代
cornerRadius;給陰影設(shè)置shadowPath;謹慎使用shouldRasterize。 - 滑動時暫停不必要的任務(wù)(如圖像下載、動畫)。
- 使用 RunLoop 監(jiān)測卡頓,收集堆棧,分析卡頓點。
高級深入
- 引入異步渲染框架,如 Texture(AsyncDisplayKit),將 UI 創(chuàng)建和布局移到后臺線程。
- 對復(fù)雜列表采用預(yù)加載(pre-fetching)和預(yù)排版,利用
UICollectionView的prefetchDataSource。 - 實現(xiàn)自己的繪制引擎,對高頻刷新的 cell 使用
CALayer的drawsAsynchronously。 - 針對特定場景(如直播間彈幕)使用 Metal 或 OpenGL 直接渲染。
- 建立性能監(jiān)控平臺,實時采集 FPS 和卡頓日志,設(shè)置報警閾值,快速發(fā)現(xiàn)和修復(fù)問題。
- 分析卡頓時的堆棧,區(qū)分是 CPU 瓶頸還是 GPU 瓶頸,針對性優(yōu)化。
通俗解釋
列表卡頓就像翻書時某一頁被粘住了,翻不過去。原因可能是這一頁內(nèi)容太多(復(fù)雜 cell),或者手不夠快(主線程忙)。優(yōu)化就是讓每一頁內(nèi)容盡量簡單(減少視圖層級),提前準(zhǔn)備好(緩存),翻頁時不干別的(子線程處理)。
題目4:什么是離屏渲染?哪些操作會觸發(fā)離屏渲染?如何避免?
專業(yè)答案
初級掌握
- 定義:在屏幕外緩沖區(qū)進行渲染,需要額外開銷。
- 觸發(fā):圓角 + 裁剪、陰影、遮罩、光柵化。
- 避免:用帶圓角的圖片;設(shè)置
shadowPath;少用masksToBounds。
中級擴展
- 理解離屏渲染的代價:創(chuàng)建新緩沖區(qū)、上下文切換(On-Screen ? Off-Screen)。
- 知道
shouldRasterize的適用場景(視圖靜態(tài)且復(fù)雜時緩存位圖有利,否則浪費)。 - 對于遮罩,盡量用 Core Graphics 繪制,而不是
layer.mask。 - 使用 Instruments 的 Core Animation 工具檢測離屏渲染區(qū)域,并量化優(yōu)化效果。
- 組透明(allowsGroupOpacity)也可能觸發(fā)離屏渲染,需注意。
高級深入
- 從渲染原理剖析:GPU 需要多次切換渲染目標(biāo),導(dǎo)致性能下降。
- 利用
CALayer的border和backgroundColor模擬簡單圓角。 - 對于復(fù)雜形狀,使用
CAShapeLayer并設(shè)置fillColor,避免遮罩。 - 設(shè)計 UI 組件時,主動避免隱式觸發(fā)離屏渲染的屬性組合。
- 在架構(gòu)層面,封裝高性能視圖,內(nèi)部使用
drawRect:自定義繪制,完全掌控渲染流程,避免系統(tǒng)自動觸發(fā)離屏渲染。 - 深入理解光柵化的緩存機制,僅在合適的場景(如復(fù)雜靜態(tài) table 頭)啟用。
通俗解釋
離屏渲染就是畫畫時先在草稿紙上畫,再描到正稿上,多了一道工序,自然就慢了。避免的方法就是盡量直接在正稿上畫(不用草稿),或者讓草稿簡單點(設(shè)置陰影路徑)。
題目5:如何檢測卡頓?
專業(yè)答案
初級掌握
- 使用 Instruments 的 Time Profiler 工具,運行 App 并觀察主線程的耗時方法。
- 利用 Xcode 內(nèi)置的 FPS 監(jiān)測器(調(diào)試選項中的「Color FPS」)。
- 通過用戶的反饋和錄屏初步判斷卡頓場景。
中級擴展
- 添加 RunLoop Observer 到主線程 RunLoop,監(jiān)聽
kCFRunLoopBeforeSources和kCFRunLoopAfterWaiting,計算耗時,超過閾值(如 50ms)則認為卡頓,并記錄堆棧。 - 使用第三方庫(如 Matrix、GT)集成卡頓監(jiān)控,上報到后臺。
- 分析卡頓堆棧,定位具體函數(shù),結(jié)合代碼優(yōu)化。
- 區(qū)分主線程卡頓的不同類型:CPU 滿負荷、鎖等待、IPC 阻塞等。
高級深入
- 搭建線上卡頓監(jiān)控平臺,采集卡頓堆棧、設(shè)備信息、操作路徑,通過符號還原系統(tǒng)庫堆棧。
- 實現(xiàn)卡頓智能分析,自動歸類卡頓類型(CPU 高負載、主線程鎖等待、IPC 阻塞等)。
- 結(jié)合性能測試自動化,在 CI 中運行卡頓檢測腳本,防止性能劣化。
- 深入理解 RunLoop 內(nèi)部機制,利用
CFRunLoopObserver精確測量每次事件處理耗時。 - 使用
MetricKit收集系統(tǒng)提供的性能數(shù)據(jù),包括卡頓、啟動時間等。
通俗解釋
卡頓檢測就像給主線程裝了個行車記錄儀,記錄它什么時候“剎車”(卡?。缓蠓治鲈?,是路況不好(復(fù)雜計算)還是司機走神(鎖等待)。
題目6:耗電優(yōu)化可以從哪些方面入手?
專業(yè)答案
初級掌握
- 少用定時器,避免頻繁喚醒 CPU。
- 定位用完及時關(guān)閉。
- 減少不必要的網(wǎng)絡(luò)請求,合并請求。
- 優(yōu)化圖片加載,避免頻繁 I/O。
中級擴展
- I/O 優(yōu)化:合并小數(shù)據(jù)寫入,使用
dispatch_io進行異步文件操作;大量數(shù)據(jù)用數(shù)據(jù)庫(SQLite/Core Data)。 - 網(wǎng)絡(luò)優(yōu)化:啟用數(shù)據(jù)壓縮,緩存重復(fù)請求,支持斷點續(xù)傳,設(shè)置合理超時。
- 定位優(yōu)化:單次定位用
requestLocation;非導(dǎo)航應(yīng)用降低精度;后臺定位開啟自動暫停。 - 硬件檢測:及時關(guān)閉加速度計、陀螺儀等傳感器。
- 使用 Instruments 的 Energy Log 工具分析耗電熱點。
高級深入
- 深入理解電源管理機制,利用 Energy Log 工具分析耗電分布。
- 優(yōu)化后臺任務(wù):使用
BGTaskScheduler代替beginBackgroundTask執(zhí)行后臺刷新。 - 針對網(wǎng)絡(luò)請求,采用 HTTP/2 多路復(fù)用減少連接開銷。
- 結(jié)合業(yè)務(wù)場景,設(shè)計智能策略:如根據(jù)電量調(diào)整功能(低電量模式降低幀率、關(guān)閉動畫)。
- 推動團隊建立耗電測試規(guī)范,使用 Instruments 的 Energy Diagnostics 進行量化評估。
- 關(guān)注系統(tǒng)低電量通知,動態(tài)調(diào)整 App 行為(如停止預(yù)加載、降低畫質(zhì))。
通俗解釋
耗電優(yōu)化就是給手機“省電”,減少無謂的消耗:別總讓 CPU 干活(少用定時器),別一直開著 GPS(定位用完就關(guān)),網(wǎng)絡(luò)請求像發(fā)微信一樣盡量合并發(fā),而不是一條一條發(fā)。
題目7:App 啟動過程是怎樣的?如何優(yōu)化啟動時間?
專業(yè)答案
初級掌握
- 啟動過程:點擊圖標(biāo) → 系統(tǒng)加載可執(zhí)行文件 → 執(zhí)行 main 函數(shù) → 調(diào)用
UIApplicationMain→didFinishLaunching。 - 優(yōu)化:將
didFinishLaunching中的部分操作延遲執(zhí)行(如放到首頁viewDidLoad后);減少不必要的動態(tài)庫和類。
中級擴展
- 設(shè)置環(huán)境變量
DYLD_PRINT_STATISTICS分析啟動耗時,區(qū)分 dyld、runtime、main 三個階段。 - 合并自定義動態(tài)庫,減少動態(tài)庫數(shù)量。
- 用
+initialize和dispatch_once替代+load方法。 - 清理未使用的類和分類,減少 ObjC 符號。
- 將非核心服務(wù)(如日志、統(tǒng)計)延遲初始化。
- 使用啟動故事板提供快速占位。
高級深入
- 采用二進制重排(order files)優(yōu)化 Page Fault 次數(shù),通過 clang 插樁收集啟動時調(diào)用的函數(shù),生成 order 文件重新排列二進制布局。
- 實現(xiàn)模塊化懶加載框架,按需加載業(yè)務(wù)模塊。
- 動態(tài)下發(fā)部分代碼(熱修復(fù)),但需權(quán)衡安全性。
- 建立啟動時間監(jiān)控系統(tǒng),在 CI 中集成,確保優(yōu)化不被破壞。
- 深入理解
dyld的加載流程,針對__DATA段進行重排減少缺頁中斷,利用premain階段優(yōu)化。 - 使用 MetricKit 收集啟動時間數(shù)據(jù),分析用戶實際啟動體驗。
通俗解釋
App 啟動就像開電腦,要加載系統(tǒng)文件(dyld)、啟動服務(wù)(runtime)、進入桌面(main)。優(yōu)化就是減少開機啟動項(延遲加載)、清理無用軟件(減少類)、換塊固態(tài)硬盤(二進制重排)。
題目8:如何瘦身安裝包?
專業(yè)答案
初級掌握
- 刪除無用圖片資源。
- 壓縮圖片(ImageOptim、TinyPNG)。
- 編譯設(shè)置中開啟
Strip Linked Product。
中級擴展
- 使用
LSUnusedResources掃描未引用的圖片。 - 分析 LinkMap 文件,找出體積大的類和方法,考慮優(yōu)化或替換。
- 關(guān)閉異常支持:
Enable C++ Exceptions = NO,Enable Objective-C Exceptions = NO,添加-fno-exceptions。 - 使用 WebP 格式替代 PNG/JPEG。
- 將重復(fù)代碼抽取為共用庫。
- 使用 Asset Catalog 自動管理多分辨率圖片。
高級深入
- 在 CI 流程中集成包體積監(jiān)控,每次構(gòu)建對比增量。
- 使用 AppCode 或自研 LLVM 插件檢測無用代碼(類、方法、全局變量)。
- 推動設(shè)計使用矢量圖標(biāo)(iconfont)和 SVG,減少位圖資源。
- 對于大資源,采用按需下載(On-Demand Resources)。
- 研究 ThinLTO 鏈接時優(yōu)化,進一步減小體積。
- 使用
bloaty等工具深入分析二進制文件,優(yōu)化代碼生成。 - 推動代碼混淆和優(yōu)化,去除調(diào)試符號,減少二進制體積。
通俗解釋
瘦身就是給 App “減肥”,去掉多余的肉(無用資源),把衣服換成輕薄的(壓縮圖片),甚至抽脂(刪除無用代碼),讓 App 下載更快,安裝更省空間。
題目9:什么是二進制重排?它在啟動優(yōu)化中起什么作用?
專業(yè)答案
初級掌握
- 二進制重排是一種優(yōu)化技術(shù),通過重新排列二進制文件中函數(shù)的順序,提高啟動速度。
- 原理:將啟動時調(diào)用的函數(shù)集中放置,減少缺頁中斷 (Page Fault) 次數(shù)。
- Xcode 中可以通過
.order文件指定函數(shù)順序。
中級擴展
- 在 Xcode 中啟用 Link Map 文件,通過分析啟動時調(diào)用的函數(shù)生成 order 文件。
- 使用
-order_file編譯選項傳入 order 文件,指導(dǎo)鏈接器重排。 - 實際效果:可以減少 Page Fault,縮短啟動時間。
- 缺點:維護成本高,需要定期更新 order 文件。
高級深入
- 使用 Clang 插樁(
-fsanitize-coverage=func,trace-pc-guard)收集啟動時調(diào)用的所有函數(shù),自動生成 order 文件。 - 深度優(yōu)化時還需考慮
__DATA段的重排,減少 dirty page 的生成。 - 將二進制重排與其他優(yōu)化結(jié)合(如靜態(tài)初始化優(yōu)化、庫合并),最大化啟動提速。
- 分享實際案例:如抖音、微信通過二進制重排優(yōu)化啟動時間。
- 實現(xiàn)自動化流程,每次發(fā)版自動生成 order 文件并集成。
通俗解釋
二進制重排就像把最常用的工具放在工具箱最上面,這樣找起來快,不用翻遍整個箱子。啟動時調(diào)用的函數(shù)集中在一起,就能減少內(nèi)存加載的次數(shù),讓 App 開得更快。
題目10:你在項目中用過哪些性能監(jiān)控工具?線上監(jiān)控如何實現(xiàn)?
專業(yè)答案
初級掌握
- 開發(fā)階段用 Instruments(Time Profiler、Leaks、Allocations)。
- Xcode 調(diào)試選項(Color Blended Layers、Color Offscreen-Rendered)。
- 線上通過用戶反饋和 Crash 日志初步判斷性能問題。
中級擴展
- 集成第三方監(jiān)控 SDK,如 Matrix、GT、Bugly 性能監(jiān)控模塊。
- 自定義卡頓監(jiān)控:基于 RunLoop 的 Observer,超過閾值記錄堆棧并上報。
- 內(nèi)存監(jiān)控:監(jiān)聽
UIApplicationDidReceiveMemoryWarningNotification,記錄內(nèi)存使用情況。 - 啟動時間監(jiān)控:自定義打點,上報冷啟動耗時。
- 網(wǎng)絡(luò)監(jiān)控:NSURLProtocol 或直接 hook 關(guān)鍵方法,統(tǒng)計請求耗時和成功率。
高級深入
- 構(gòu)建完整的線上性能監(jiān)控平臺,覆蓋卡頓、內(nèi)存、耗電、網(wǎng)絡(luò)、啟動時間等維度。
- 實現(xiàn)堆棧符號化服務(wù),解析上報的卡頓堆棧。
- 利用 MetricKit 獲取系統(tǒng)級性能數(shù)據(jù),結(jié)合自定義數(shù)據(jù)綜合分析。
- 建立異常檢測算法,自動識別性能劣化并報警。
- 將性能監(jiān)控與 CI/CD 結(jié)合,在測試階段自動運行性能測試用例,生成報告。
- 深入底層,使用 fishhook、dyld 插入等技術(shù)實現(xiàn)無侵入監(jiān)控。
通俗解釋
監(jiān)控工具就像給 App 裝上健康監(jiān)測儀,開發(fā)時用醫(yī)院的大型設(shè)備(Instruments)全面體檢,上線后用便攜設(shè)備(自定義監(jiān)控)持續(xù)監(jiān)測,發(fā)現(xiàn)異常及時報警。
題目11:什么是 OOM(內(nèi)存溢出)?如何分析和解決?
專業(yè)答案
初級掌握
- OOM 是指 App 內(nèi)存占用超過系統(tǒng)限制,被系統(tǒng)殺掉。
- 常見原因:內(nèi)存泄漏、圖片過大未釋放、數(shù)據(jù)緩存過多。
- 解決方法:檢查代碼中循環(huán)引用、優(yōu)化圖片加載、及時清理緩存。
中級擴展
- 分析 OOM 可以使用 Xcode 的 Memory Graph 和 Instruments 的 Allocations 找到內(nèi)存增長點。
- 利用
UIDevice的memoryFootprint獲取當(dāng)前內(nèi)存使用量。 - 區(qū)分 OOM 和普通 Crash:OOM 通常沒有 Crash 日志,但可以通過分析 jetsam 日志判斷。
- 使用
OS_dispatch_source監(jiān)控內(nèi)存水位,提前預(yù)警或清理緩存。
高級深入
- 深入理解 Jetsam 機制:iOS 系統(tǒng)在內(nèi)存緊張時會按照優(yōu)先級殺掉進程。
- 獲取 jetsam 日志:通過
libsystem_kernel.dylib的os_log或私有 API 收集(需注意審核風(fēng)險)。 - 分析內(nèi)存峰值場景,結(jié)合 VM Tracker 分析內(nèi)存區(qū)域,找出占用大戶(如 Mapped 文件、ImageIO)。
- 使用
malloc調(diào)試工具檢測堆內(nèi)存問題,如MallocStackLogging。 - 設(shè)計內(nèi)存安全策略:如緩存淘汰機制、分頁加載、懶加載。
- 搭建 OOM 監(jiān)控系統(tǒng),自動采集內(nèi)存使用情況和 jetsam 日志,歸因分析。
通俗解釋
OOM 就是 App 吃內(nèi)存太多,被系統(tǒng)強制退出。好比自助餐吃太多被趕出去。分析時看看哪些菜(對象)最占肚子,以后少吃或分次吃。
題目12:如何優(yōu)化 App 的 I/O 操作?
專業(yè)答案
初級掌握
- 避免頻繁寫入小文件,盡量合并寫入。
- 使用異步 I/O,避免阻塞主線程。
- 文件讀寫完成后及時關(guān)閉文件句柄。
中級擴展
- 使用
dispatch_io進行異步文件讀寫,系統(tǒng)會自動優(yōu)化磁盤訪問。 - 使用
mmap映射大文件,減少系統(tǒng)調(diào)用和內(nèi)存拷貝。 - 使用數(shù)據(jù)庫(SQLite、Core Data)替代散文件存儲,利用事務(wù)批量操作。
- 在
applicationWillTerminate或進入后臺時保存數(shù)據(jù),避免頻繁寫入。
高級深入
- 深入理解文件系統(tǒng)特性,如 APFS 的寫時復(fù)制,優(yōu)化文件寫入策略。
- 使用
fcntl設(shè)置文件緩存策略,如F_NOCACHE避免占用內(nèi)存緩存。 - 對于關(guān)鍵數(shù)據(jù),考慮使用
Data Protection加密,但需注意性能開銷。 - 使用
File Coordination避免多線程讀寫沖突。 - 分析 I/O 性能瓶頸時,使用 Instruments 的 File Activity 工具。
通俗解釋
I/O 優(yōu)化就像整理倉庫,不要頻繁地一件一件搬東西(小文件寫入),而要批量搬運(合并寫入),或者直接開辟傳送帶(mmap)。倉庫管理效率高了,體力消耗就小了。
題目13:網(wǎng)絡(luò)優(yōu)化有哪些具體措施?
專業(yè)答案
初級掌握
- 使用緩存策略,避免重復(fù)請求。
- 壓縮請求和響應(yīng)數(shù)據(jù)(如使用 gzip)。
- 合并多個請求,減少連接數(shù)。
- 設(shè)置合理超時,允許用戶取消請求。
中級擴展
- 采用 HTTP/2 多路復(fù)用,降低延遲。
- 使用 Protocol Buffers、MessagePack 等高效序列化格式。
- 支持斷點續(xù)傳和后臺傳輸。
- 對圖片資源使用 WebP 格式。
- 預(yù)加載策略:根據(jù)用戶行為提前加載可能用到的數(shù)據(jù)。
- 使用 NSURLCache 管理緩存,設(shè)置緩存策略和磁盤容量。
高級深入
- 實現(xiàn)智能預(yù)加載和預(yù)連接,如根據(jù)網(wǎng)絡(luò)狀態(tài)調(diào)整預(yù)加載數(shù)量。
- 使用 HTTP/3 (QUIC) 進一步優(yōu)化連接建立時間。
- 對于長連接,使用 WebSocket 或自定義 TCP 協(xié)議優(yōu)化。
- 分析網(wǎng)絡(luò)請求的 DNS 解析時間,使用 HTTPDNS 優(yōu)化。
- 建立網(wǎng)絡(luò)性能監(jiān)控體系,統(tǒng)計請求成功率、耗時、流量消耗等。
- 利用 Network.framework 進行底層網(wǎng)絡(luò)控制,實現(xiàn)精細化的流量管理。
通俗解釋
網(wǎng)絡(luò)優(yōu)化就是讓數(shù)據(jù)傳輸更快更省電,像寄快遞一樣:打包好(壓縮)、合并發(fā)貨(多路復(fù)用)、記錄查詢(緩存),別等太久(超時),還能續(xù)寄(斷點續(xù)傳)。
題目14:定位優(yōu)化有哪些要點?
專業(yè)答案
初級掌握
- 用完定位及時關(guān)閉。
- 非導(dǎo)航應(yīng)用使用低精度定位。
- 在不需要定位時調(diào)用
stopUpdatingLocation。
中級擴展
- 單次定位使用
requestLocation,系統(tǒng)自動關(guān)閉硬件。 - 后臺定位設(shè)置
pausesLocationUpdatesAutomatically = YES。 - 使用區(qū)域監(jiān)聽 (region monitoring) 代替持續(xù)定位。
- 降低精度,使用
kCLLocationAccuracyKilometer而不是Best。
高級深入
- 根據(jù)業(yè)務(wù)場景動態(tài)調(diào)整精度,如進入某區(qū)域后再提高精度。
- 使用
CLLocationManager的activityType提示系統(tǒng)優(yōu)化定位策略。 - 分析定位耗電時使用 Energy Log 工具。
- 結(jié)合運動傳感器判斷用戶狀態(tài),僅在需要時開啟定位。
- 使用 visit monitoring 監(jiān)測重要地點變化。
通俗解釋
定位優(yōu)化就是問路策略:如果只是想知道大概位置,問一下就行(單次定位),別一直開著 GPS;如果要去某個區(qū)域,快到的時候再問(區(qū)域監(jiān)聽),省電。
題目15:傳感器優(yōu)化如何做?
專業(yè)答案
初級掌握
- 在使用完加速度計、陀螺儀后調(diào)用
stopDeviceMotionUpdates。 - 不需要高頻率時降低采樣頻率。
- 避免在后臺持續(xù)更新傳感器數(shù)據(jù)。
中級擴展
- 使用 Core Motion 框架時,根據(jù)實際需要選擇適當(dāng)?shù)年犃泻透麻g隔。
- 使用
isDeviceMotionAvailable檢查硬件可用性,避免無效請求。 - 在
applicationWillResignActive中暫停傳感器更新,恢復(fù)時重啟。
高級深入
- 利用傳感器融合算法,減少原始數(shù)據(jù)采集頻率,提高數(shù)據(jù)質(zhì)量。
- 對于運動類 App,結(jié)合定位和傳感器數(shù)據(jù),優(yōu)化功耗。
- 使用
CMMotionActivityManager識別用戶運動狀態(tài),動態(tài)調(diào)整傳感器策略。 - 分析傳感器耗電時使用 Energy Log。
通俗解釋
傳感器優(yōu)化就像運動手環(huán),不運動時就休息,需要記錄步數(shù)時才開啟,別一直開著浪費電。
題目16:什么是 LinkMap 文件?如何用它瘦身?
專業(yè)答案
初級掌握
- LinkMap 是 Xcode 生成的鏈接映射文件,記錄了可執(zhí)行文件中所有符號(類、方法、變量)的大小和位置。
- 在 Build Settings 中設(shè)置
Write Link Map File = YES可以生成。 - 通過查看 LinkMap 可以了解哪些類或方法占用空間大。
中級擴展
- 使用第三方工具(如
LinkMap)解析 LinkMap 文件,可視化展示各模塊體積。 - 根據(jù) LinkMap 分析結(jié)果,找出體積大的第三方庫或業(yè)務(wù)代碼,考慮優(yōu)化或替換。
- 對比不同版本的 LinkMap,監(jiān)控體積變化。
高級深入
- 編寫腳本自動化分析 LinkMap,在 CI 中集成,每次構(gòu)建自動生成體積報告。
- 結(jié)合
-dead_strip選項去除未使用的代碼。 - 深入分析
__TEXT、__DATA、__LINKEDIT各段的大小,優(yōu)化內(nèi)存布局。 - 通過 LinkMap 指導(dǎo)二進制重排,優(yōu)化啟動性能。
通俗解釋
LinkMap 就像快遞包裹的清單,告訴你每個物品(函數(shù)、類)占多少地方。通過清單可以找出最占地方的物品,考慮是否換小包裝或扔掉。
題目17:你用過哪些 Xcode 調(diào)試選項來檢查性能?
專業(yè)答案
初級掌握
- Color Blended Layers:高亮顯示需要混合的透明圖層,幫助優(yōu)化不透明設(shè)置。
- Color Offscreen-Rendered:高亮顯示離屏渲染區(qū)域。
- Color Misaligned Images:檢測圖片是否像素對齊。
- 這些選項在 Scheme 的 Diagnostics 中開啟。
中級擴展
- Color Copied Images:檢測 GPU 需要拷貝的圖片。
- Color OpenGL / Metal 相關(guān)選項:幫助分析圖形性能。
- 結(jié)合 Instruments 的 Core Animation 模板綜合分析。
- 使用
Instruments的System Trace查看線程調(diào)度和鎖競爭。
高級深入
- 理解每個調(diào)試選項背后的原理,如
Color Blended Layers通過繪制時的混合信息標(biāo)記區(qū)域。 - 根據(jù)調(diào)試選項發(fā)現(xiàn)的問題,進一步使用底層工具驗證,如
Metal調(diào)試器。 - 編寫自動化測試,確保性能優(yōu)化效果不退化。
通俗解釋
Xcode 調(diào)試選項就像給 App 穿上透視衣,讓你一眼看出哪里透明(混合)、哪里多畫了(離屏渲染)、哪里對不齊(圖片拉伸)。問題一目了然。
題目18:什么是預(yù)加載和預(yù)排版?如何實現(xiàn)?
專業(yè)答案
初級掌握
- 預(yù)加載:提前加載即將顯示的數(shù)據(jù),減少用戶等待時間。
- 預(yù)排版:提前計算好視圖的布局,避免滑動時實時計算。
- 常見于列表優(yōu)化,如緩存行高、提前請求下一頁數(shù)據(jù)。
中級擴展
- 使用
UICollectionView的prefetchDataSource實現(xiàn)預(yù)加載。 - 預(yù)排版可以使用
TextKit或Core Text提前計算文本高度和繪制內(nèi)容。 - 圖片預(yù)加載可使用
SDWebImage的預(yù)下載功能。 - 在子線程進行排版計算,緩存計算結(jié)果。
高級深入
- 實現(xiàn)復(fù)雜的預(yù)加載策略,如根據(jù)滑動速度動態(tài)調(diào)整預(yù)加載數(shù)量。
- 預(yù)排版時考慮不同屏幕尺寸和動態(tài)字體,保持緩存命中率。
- 使用異步渲染框架(如 Texture)將預(yù)排版和預(yù)渲染結(jié)合。
- 預(yù)加載與內(nèi)存管理結(jié)合,防止過度預(yù)加載導(dǎo)致內(nèi)存壓力。
通俗解釋
預(yù)加載就像提前備菜,客人點了就能快速上菜;預(yù)排版就像提前擺盤,出菜時直接端出去。這樣客人不用等太久。
三、初中高工程師回答指南(各層級備考建議)
初級工程師備考建議
-
核心掌握:
- 基礎(chǔ)的內(nèi)存管理(ARC、循環(huán)引用、weak/strong)。
- UITableView/UICollectionView 重用機制。
- 簡單圖片加載方式(SDWebImage 基本使用)。
- 常見卡頓原因(主線程耗時、離屏渲染基礎(chǔ)概念)。
- 啟動優(yōu)化基礎(chǔ)(延遲加載)。
- 包體積基本操作(刪除無用圖片、壓縮)。
-
備考重點:
- 熟悉面試題的基礎(chǔ)答案,能用簡潔語言描述。
- 能夠使用 Instruments 的 Leaks 和 Allocations 進行基本檢測。
- 了解 Xcode 編譯設(shè)置中瘦身選項(Strip 等)。
-
加分項:
- 在實際項目中有過一兩個性能優(yōu)化小案例。
- 了解 RunLoop 的基本概念。
中級工程師備考建議
-
核心掌握:
- 深入理解離屏渲染的原理和觸發(fā)場景,能針對性地優(yōu)化。
- 熟練使用 Instruments(Time Profiler、Core Animation、Leaks、Allocations)分析問題。
- 掌握圖片解碼、降采樣技術(shù),理解 NSCache 使用。
- 能夠分析啟動耗時,并應(yīng)用常見的優(yōu)化手段(減少動態(tài)庫、用 +initialize 替代 +load 等)。
- 熟悉 LinkMap 分析,能定位包體積過大的原因。
- 理解耗電優(yōu)化的主要方面(I/O、網(wǎng)絡(luò)、定位、傳感器)。
-
備考重點:
- 能夠結(jié)合實際項目經(jīng)驗,講述自己解決過的性能問題。
- 對性能優(yōu)化有系統(tǒng)性思考,能從多個維度(CPU、GPU、I/O、網(wǎng)絡(luò))展開。
- 了解一些第三方優(yōu)化框架的原理(如 Texture、YYKit)。
-
加分項:
- 參與過專項性能優(yōu)化項目(如啟動優(yōu)化、包體積優(yōu)化)。
- 對 RunLoop 有深入理解,能自定義卡頓檢測。
- 掌握一些底層知識,如 dyld 加載流程。
高級工程師備考建議
-
核心掌握:
- 掌握性能優(yōu)化的底層原理(虛擬內(nèi)存、Page Fault、GPU 渲染管線、編譯鏈接過程)。
- 能夠設(shè)計并搭建性能監(jiān)控體系(卡頓監(jiān)控、內(nèi)存泄漏監(jiān)控、啟動時間監(jiān)控)。
- 熟悉編譯技術(shù),能夠通過 LLVM 插件或腳本自動化檢測無用代碼。
- 對二進制重排、ThinLTO 等高級優(yōu)化技術(shù)有實戰(zhàn)經(jīng)驗。
- 具備架構(gòu)能力,能推動團隊建立性能優(yōu)化規(guī)范和流程。
-
備考重點:
- 強調(diào)系統(tǒng)性的優(yōu)化方案和量化結(jié)果(優(yōu)化了多少百分比)。
- 分享復(fù)雜場景的解決方案(如直播彈幕、長列表異步渲染)。
- 展示對前沿技術(shù)的關(guān)注(Metal、Swift 并發(fā)、Swift 6 的新特性)。
-
加分項:
- 有開源性能優(yōu)化工具或組件貢獻。
- 在技術(shù)大會或博客分享過性能優(yōu)化經(jīng)驗。
- 能結(jié)合業(yè)務(wù)特點設(shè)計獨特的優(yōu)化策略。
四、英文術(shù)語速查表(中英對照,已核對準(zhǔn)確性)
| 英文術(shù)語 | 中文解釋 |
|---|---|
| CPU (Central Processing Unit) | 中央處理器 |
| GPU (Graphics Processing Unit) | 圖形處理器 |
| Frame Buffer | 幀緩沖區(qū) |
| VSync (Vertical Synchronization) | 垂直同步信號 |
| On-Screen Rendering | 當(dāng)前屏幕渲染 |
| Off-Screen Rendering | 離屏渲染 |
| Rasterization | 光柵化 |
| Mask | 遮罩 |
| Corner Radius | 圓角半徑 |
| Shadow Path | 陰影路徑 |
| opaque | 不透明 |
| Auto Layout | 自動布局 |
| LinkMap | 鏈接映射文件 |
| I/O (Input/Output) | 輸入/輸出 |
| dispatch_io | GCD 異步 I/O API |
| Core Data | 蘋果對象圖管理框架 |
| SQLite | 輕量級關(guān)系型數(shù)據(jù)庫 |
| dyld (dynamic link editor) | 動態(tài)鏈接器 |
| Runtime | 運行時 |
| +load | 類加載時調(diào)用的方法 |
| +initialize | 類第一次接收消息時調(diào)用的方法 |
| dispatch_once | 一次性執(zhí)行 |
| LLVM | 底層虛擬機編譯器框架 |
| Strip | 剝離(移除調(diào)試符號) |
| Thinning | 瘦身 |
| Time Profiler | 時間分析工具 |
| Allocations | 內(nèi)存分配分析工具 |
| Leaks | 內(nèi)存泄漏檢測工具 |
| Core Animation | 圖形性能檢測工具 |
| FPS (Frames Per Second) | 每秒幀數(shù) |
| Page Fault | 缺頁中斷 |
| mmap | 內(nèi)存映射文件 |
| Texture (AsyncDisplayKit) | 異步 UI 渲染框架 |
| Metal | 蘋果低級圖形編程框架 |
| OpenGL | 跨平臺圖形 API |
| Image I/O | 圖像編解碼框架 |
| RunLoop | 運行循環(huán) |
| Autoreleasepool | 自動釋放池 |
| NSCache | 自動清理緩存類 |
| SDWebImage | 第三方圖片加載庫 |
| YYCache | 高性能緩存庫 |
| MLeaksFinder | 內(nèi)存泄漏檢測工具 |
| LSUnusedResources | 未使用資源檢測工具 |
| ThinLTO | 鏈接時優(yōu)化技術(shù) |
| Binary Reordering | 二進制重排 |
| On-Demand Resources | 按需資源 |
| Downsampling | 降采樣 |
| Sprite Sheet / Atlas | 精靈圖/紋理圖集 |
| Pre-fetching | 預(yù)加載 |
| Lazy Loading | 懶加載 |
| Background Task | 后臺任務(wù) |
| Energy Diagnostics | 電量診斷工具 |
| VM Tracker | 虛擬內(nèi)存跟蹤器 |
| MetricKit | 蘋果性能數(shù)據(jù)收集框架 |
| Jetsam | iOS 內(nèi)存壓力管理機制 |
以上為 iOS 性能優(yōu)化的完整知識庫,涵蓋思維導(dǎo)圖、面試題分層答案、備考指南和術(shù)語表,旨在幫助不同級別的開發(fā)者系統(tǒng)學(xué)習(xí)和準(zhǔn)備面試。