【iOS】iOS崩潰總結

【iOS】iOS崩潰總結


一、前言

之前寫了一篇博文《【Flutter】程序報錯導致的灰屏總結》,瀏覽量、收藏率和點贊量還挺高,還被收錄了,就想著總結一下iOS崩潰這個也是在iOS面試中經常被問到的

在 iOS 開發過程中,導致 App 崩潰的原因多種多樣,大致可以分為以下幾大類,
Alt
還是很想說,代碼規范很重要,代碼格式化也能方便我們查找BUG!!!


二、內存相關問題

  1. 訪問野指針(野地址)

    • 訪問已經被釋放的對象(Use After Free)
    • 常見崩潰提示:EXC_BAD_ACCESSSIGSEGV
  2. 內存泄漏造成系統回收進程(OOM)

    • 未釋放的內存持續增長,導致系統強制殺掉進程
    • 通常無法捕獲崩潰日志,但系統會記錄在 JetsamEvent
  3. 循環引用

    • block 中引用 selfdelegate 沒有用 weak,導致對象無法釋放

三、多線程問題

  1. 👉🏻 線程安全問題

    • 多線程讀寫同一數據結構,導致崩潰或數據錯亂
  2. 👉🏻 死鎖

    • dispatch_sync 嵌套調用自己,或等待永遠不會結束的任務
  3. 👉🏻 后臺線程更新 UI

    • UIKit 只能在主線程使用,在子線程操作 UI 會崩潰

四、數組、字典越界或非法數據

  1. 👉🏻 數組越界

    NSArray *array = @[];
    NSLog(@"%@", array[1]); // 崩潰
    
  2. 👉🏻 向不可變字典中插入 nil

    [@{@"key": nil} mutableCopy]; // 崩潰
    
  3. 👉🏻 非法類型轉換

    • [someObject stringByAppendingString:@"test"],但 someObject 實際是 NSNull

五、KVO/KVC 相關

  1. 👉🏻 KVO 崩潰

    • 重復添加或移除觀察者
    • 在對象釋放前未移除觀察者
    • 修改未定義 keyPath
  2. 👉🏻 KVC 崩潰

    • setValue:forKey: 時 key 錯誤
    • 對私有變量或不存在屬性賦值

六、UI相關問題

  1. 👉🏻 約束沖突導致 UI 崩潰

    • AutoLayout 添加了沖突的 constraint
  2. 👉🏻 Storyboard / XIB 使用錯誤

    • IBOutlet 未連接或連接錯誤
    • 控件在 XIB 中已刪除,但代碼中仍引用
  3. 👉🏻 未處理的手勢或交互崩潰

    • 比如使用 UIPanGestureRecognizer 時 target 指針已釋放

七、文件和路徑操作問題

  1. 👉🏻 文件路徑為空或錯誤

    • 使用 NSString *path = nil; [NSData dataWithContentsOfFile:path];
  2. 👉🏻 訪問沙盒外非法路徑

    • iOS 不允許訪問 App 沙盒外的文件路徑

八、網絡或 JSON 解析異常

  1. 👉🏻 JSON 結構變化或數據缺失

    • 使用 NSJSONSerialization 時返回了 null
    • 使用 Model 框架(如 YYModel、MJExtension)時解析 nil 或錯誤類型字段

九、未捕獲的異常

  1. 👉🏻 未使用 try-catch 包裹潛在異常代碼(如 NSException)
  2. 👉🏻 使用斷言(NSAssert)在 Release 模式中崩潰

十、符號錯誤 / 動態庫加載失敗

  1. 👉🏻 dlsym 找不到符號

    • 使用動態庫(如 C 語言、Go 編譯為 static lib)時忘記導出符號或鏈接失敗
  2. 👉🏻 調用系統私有 API

    • 在審核或某些系統中崩潰

十一、其他系統行為

  1. 👉🏻 App 被系統強制終止

    • 使用過多內存、后臺違規行為等
    • iOS 低電量或資源緊張時殺掉后臺 App
  2. 👉🏻 權限未申請導致崩潰

    • 相機、麥克風、定位等未正確配置權限描述

十二、總結&工具

👉🏻 總結

1. 內存相關問題
  • 針對于內存相關的崩潰,要養成良好的開發習慣,
    定期使用Instruments排查一下,還有就是內存泄露或者暴漲,可以在基類的銷毀方法里面打印一下delloc,如果頁面銷毀沒有打印,及時檢查一下相關的邏輯,
  • 還有一些導致內存暴漲的,比如加載大圖,如果使用imageNamed: 會緩存,可以使用imageWithContentsOfFile:;
  • 還有可以復用的場景,比如自定義的試圖View;
2. 多線程問題
  • 關于線程不安全訪問,可以用 dispatch_queue 同步訪問共享資源,也可以用 @synchronized 或 NSLock 等鎖機制,還可以封裝線程安全類;
  • 對于死鎖,避免 dispatch_sync 嵌套調用當前 queue,使用主線程 dispatch_async 更新 UI
  • 在子線程更新UI,可以使用 dispatch_async(dispatch_get_main_queue(), ^{ // UI操作 });
3. 集合類崩潰問題

這個就很好解決了,網上有封裝好的安全插入或者存儲的庫,都是使用runtime寫的。

4. KVO / KVC 崩潰
  • 可以封裝 KVO,推薦使用 FBKVOController,iOS 11 起建議使用 NSKeyValueObservation 替代手動 add/remove;
  • - (void)setValue:forUndefinedKey: 中打日志避免崩潰,對 model 層添加 @property 完整定義,不讓非法 key 存在;
5. UI 崩潰 & 防護
  • 針對于Storyboard/XIB 連接錯誤,每次修改 IBOutlet 后編譯驗證,控件刪除時一并移除 IBOutlet;
  • AutoLayout 崩潰,設置約束時避免沖突(使用 >=、<= 等)
6. 文件/路徑/JSON 解析
  • 針對于nil或者非法值,可以使用fileExistsAtPath
  • 如果是JSON 解析字段缺失或類型不匹配,可以使用 isKindOfClass 判斷類型,還可以封裝 Model 層容錯代碼(如缺字段時默認值)
7. 權限問題
  • 一個是添加plist權限字段
  • 還有就是在使用前,做一下權限的判斷;
8. 其他高風險點
  • 可以使用斷言
  • 使用@try @catch,但是我不建議使用@try @catch,這樣會導致問題一直無法被暴露

👉🏻 工具

工具功能
Xcode Debugger崩潰堆棧分析、調試器跟蹤
Crashlytics崩潰日志收集平臺
Bugly / Sentry支持符號化和用戶設備統計
Instruments內存泄漏、對象分配分析
Address Sanitizer運行時檢測內存訪問越界等問題

十三、關于作者(ZFJ_張福杰)

  • 官網:https://zfjsafe.com
  • 博客:https://zfj1128.blog.csdn.net
  • Github:https://github.com/zfjsyqk
  • Gitee:https://gitee.com/zfj1128
  • 打賞:https://zfjsafe.com/paycode

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習:特征向量與數據維數概念

特征向量與數據維數概念 一、特征向量與維數的定義 特征向量與特征類別 在機器學習和數據處理中&#xff0c;每個樣本通常由多個特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一張圖片的特征可能包括顏色、形狀、紋理等&#xff1b;一個客戶的特征可能包括年齡…

開發基于Jeston Orin Nx 開發版 16G的實現

一、基本配置 1.配置參數 密碼&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 終端輸入命令&#xff1a;sudo jtop 其中Jetpack是英偉達提供的專門供它自己的嵌入式計算機平臺使用的人工智能包。 終…

【技術分享】XR技術體系淺析:VR、AR與MR的區別、聯系與應用實踐

XR技術體系淺析&#xff1a;VR、AR與MR的區別、聯系與應用實踐 作者&#xff1a;EQ 雪梨蛋花湯 本文是技術分享文檔&#xff0c;淺析VR&#xff08;虛擬現實&#xff09;、AR&#xff08;增強現實&#xff09;、MR&#xff08;混合現實&#xff09;的定義、特性、技術演進路線&…

R語言入門課| 05 一文掌握R語言常見數據類型

視頻教程 大家可以先做一做R語言基礎小測驗&#xff0c;看看自己是否需要跟我們5.5h入門R語言的課程。 先上教程視頻&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整視頻回放和答疑服務可見&#xff1a;5.5h入門R語言 本節課程視頻…

vRDMA 發布,助力云上 VPC 內高性能通信

資料來源&#xff1a;火山引擎-開發者社區 近日&#xff0c;火山引擎基于部分云服務器實例規格邀測發布 vRDMA 特性&#xff0c;提供云上 VPC 內大規模 RDMA 加速能力&#xff0c;可兼容傳統 HPC 應用、AI 應用以及傳統 TCP/IP 應用&#xff0c;降低大眾化場景的適配門檻&#…

Win10安裝dify

一、win10虛擬化設置&#xff0c;控制面板中開啟如下三個服務 二、檢查確認wls服務開啟 設置自動啟動并啟動 確認服務開啟 bcdedit 是否為auto&#xff0c;如果不是&#xff0c;設置為auto bcdedit /set hypervisorlaunchtype autocpu是否為虛擬化 更新wsl wsl --update二 …

【ai學習筆記】GitLab

CI/CD&#xff08;持續集成/持續交付&#xff09;是現代軟件開發中的關鍵實踐&#xff0c;通過自動化工具可以大幅提升開發效率和軟件質量。下面為你介紹CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持續集成&#xff08;CI&#xff09;&#xff1…

Solidity 從 0 到 1 |Web3 開發入門免費共學營

開啟你的 Web3 開發之旅&#xff0c;從 Sonic 開始&#xff01; 想進入區塊鏈開發的世界&#xff0c;卻不知道從哪里開始&#xff1f;選擇對的語言和平臺&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合約開發語言&#xff0c;被廣泛應用于以太坊及其…

【unitrix】 4.4 類型級整數比較系統(cmp.rs)

一、源碼 這段代碼實現了一個類型級別的整數比較系統&#xff0c;允許在編譯時進行整數比較操作。它定義了一套類型來表示比較結果&#xff0c;并為不同類型的整數實現了比較邏輯。 use core::cmp::Ordering; use core::default::Default; use crate::sealed::Sealed; use cr…

2025年滲透測試面試題總結-2025年HW(護網面試) 14(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 1. SQL注入原理 &#x1f4a5; 2. XXE攻擊&#xff08;XML外部實體注入&#xff09; &#x1f9e9; 3. SQ…

Android開發根據滑動距離標題欄進行漸變

Android開發根據滑動距離標題欄進行漸變 假設滑動控件是NestedScrollView。 先監聽NestedScrollView的滑動距離&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…

高中成績可視化平臺開發筆記

高中成績可視化平臺&#xff08;1&#xff09; 一、項目概述 本系統是一個基于 PyQt5 和 Matplotlib 的高中成績數據可視化分析平臺&#xff0c;旨在幫助教師快速了解學生成績分布、班級對比、學科表現等關鍵指標。平臺支持文科與理科的數據切換&#xff0c;并提供多個維度的圖…

自動化按需導入組件庫的工具rust版本完成開源了

背景 當我為每個Vue項目使用ui組件庫的時候&#xff0c;都會使用按需導入的方式來使用ui組件庫。但是每次按需導入&#xff0c;不可避免的就需要做以下三步。我們以element plus ui組件庫為例。 1. 安裝依賴 第一步&#xff0c;當然是需要安裝依賴。命令如下: pnpm add unp…

Linux內核中TCP分段的核心機制:tcp_fragment函數解析

引言:TCP分段的必要性 在TCP/IP協議棧中,MSS(最大分段大小) 限制了單次傳輸的數據量。當應用層發送的數據超過當前路徑的MSS時,內核必須執行分段操作。tcp_fragment函數正是Linux內核中處理TCP分段的核心機制,它巧妙地在協議合規性、內存安全和性能效率之間取得平衡。 一…

【趙渝強老師】OceanBase OBServer節點的SQL層

OceanBase OBServer節點的SQL層將用戶的SQL請求轉化成對一個或多個Tablet的數據訪問。SQL層會按照以下順序經過一系列組件來處理一個SQL&#xff1a; Parser -->Resolver-->Transformer-->Optimizer-->CodeGenerator-->Executor。視頻講解如下 【趙渝強老師】O…

從“高配”到“普惠”,黑芝麻智能攜手Nullmax打造輔助駕駛主流量產方案

近日&#xff0c;黑芝麻智能攜手Nullmax打造的輔助駕駛主流量產方案正式發布。該方案面向8-15萬元級別主流車型&#xff0c;基于單顆黑芝麻智能武當C1236跨域計算芯片&#xff0c;集成Nullmax全棧自研的軟件技術架構&#xff0c;結合領先的視覺感知算法&#xff0c;打造高性能輔…

信息安全認證體系全解析:從資質證明到行業準入的實踐指南

Hello&#xff01;大家好&#xff0c;小編是一名專注IT領域的資深探索家&#xff0c;大家發現了嗎&#xff1f;現在刷招聘軟件&#xff0c;國企安全崗必標 "CISP 優先"&#xff0c;外企招聘悄悄寫著 "CISSP 加分"—— 這些帶字母的證書到底是啥&#xff1f…

優雅地創建實體類——Builder 鏈式調用

我們來看以下的代碼。改造前構造實體類用重載構造器或用 setter 對變量進行賦值&#xff0c;一旦變量變多則需要對每個變量進行 set 賦值&#xff0c;并且有可能會賦值錯對象。 private static void test() {//1.構造器賦值Task task1 new Task("2023000000009439"…

如何輕松將照片從 iPhone 傳輸到 Android?

從 iPhone 換到 Android 手機后&#xff0c;你肯定不想丟掉珍貴的照片回憶吧&#xff1f;好在&#xff0c;本文分享了 6 種有效的解決方案&#xff0c;教你如何輕松地將照片從 iPhone 傳輸到 Android。 第 1 部分&#xff1a;如何通過 iReaShare Phone Transfer 將照片從 iPhon…

AI編程:[體驗]存量微服務架構下植入WebSocket的“踩坑”與“填坑”

一、核心需求 功能需求&#xff1a;用戶可以通過語音與AI對話&#xff0c;并實現類似ChatGPT的實時交互&#xff08;流式響應&#xff0c;打字機效果&#xff09;技術需求&#xff1a;在現有微服務架構中進行擴展&#xff08;SpringCloud&#xff09; 二、技術盲點 陌生領域 …