iOS性能優(yōu)化-思維導(dǎo)圖面試題答案

一、思維導(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)存。
  • viewDidDisappeardealloc 中將不需要的對象置 nil
  • 利用 Xcode 的 Instruments 中的 Leaks 工具檢測內(nèi)存泄漏。

中級擴展

  • 圖片內(nèi)存優(yōu)化:根據(jù)場景選擇 imageNamed:(系統(tǒng)緩存)或 imageWithContentsOfFile:(無緩存);將圖片解碼放到子線程;使用 ImageIO 對圖片降采樣 (Downsampling) 生成縮略圖,避免加載原圖。
  • 合理使用 NSCache 管理可復(fù)用對象,設(shè)置成本限制和數(shù)量限制,并在內(nèi)存警告時自動清理。
  • 對于大文件,使用 NSDataNSDataReadingMappedIfSafe 選項,將文件映射到內(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 的 structenum 代替部分 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ù)排版,利用 UICollectionViewprefetchDataSource
  • 實現(xiàn)自己的繪制引擎,對高頻刷新的 cell 使用 CALayerdrawsAsynchronously。
  • 針對特定場景(如直播間彈幕)使用 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)致性能下降。
  • 利用 CALayerborderbackgroundColor 模擬簡單圓角。
  • 對于復(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)聽 kCFRunLoopBeforeSourceskCFRunLoopAfterWaiting,計算耗時,超過閾值(如 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)用 UIApplicationMaindidFinishLaunching。
  • 優(yōu)化:將 didFinishLaunching 中的部分操作延遲執(zhí)行(如放到首頁 viewDidLoad 后);減少不必要的動態(tài)庫和類。

中級擴展

  • 設(shè)置環(huán)境變量 DYLD_PRINT_STATISTICS 分析啟動耗時,區(qū)分 dyld、runtime、main 三個階段。
  • 合并自定義動態(tài)庫,減少動態(tài)庫數(shù)量。
  • +initializedispatch_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)存增長點。
  • 利用 UIDevicememoryFootprint 獲取當(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.dylibos_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ū)域后再提高精度。
  • 使用 CLLocationManageractivityType 提示系統(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 模板綜合分析。
  • 使用 InstrumentsSystem 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ù)。

中級擴展

  • 使用 UICollectionViewprefetchDataSource 實現(xiàn)預(yù)加載。
  • 預(yù)排版可以使用 TextKitCore 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)備面試。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容