iOS 父对象dealloc时触发子对象懒加载导致出现崩溃原因探究和解决

一. 背景

项目上线后,偶现了一个崩溃,崩溃堆栈如下,从表面看崩溃的原因是在vc对象dealloc的时候,访问了一个懒加载的对象,这时候触发了该对象的弱引用创建。

二. 分析

因为这个崩溃是偶现的,经排查下来,如果VC页面从初始化到即将dealloc,都没有调用过这个对象,只在dealloc访问了首次这个对象的懒加载方法,而这个对象刚好有代理或者block回调,触发了VC对象的弱引用的创建,就一定会触发崩溃。

例如如下代码:

在对象dealloc的时候,首次调用子对象的懒加载方法,都会触发该对象的弱引用的创建,都会触发崩溃。

ini 复制代码
// 测试视图
- (FJFLazyTestView *)testView {
    if (!_testView) {
        _testView = [[FJFLazyTestView alloc] init];
        _testView.delegate = self; /// 崩溃点
    }
    return _testView;
}

// 测试视图
- (FJFLazyTestView *)testView {
    if (!_testView) {
        _testView = [[FJFLazyTestView alloc] init];
        __weak typeof(self) weakSelf = self; // 崩溃点
        _testView.testBlock = ^{
            __strong typeof(weakSelf) strongSelf = weakSelf;
                if (!strongSelf) return; // 父对象已销毁时退出
            [strongSelf testPrint];
        };
    }
    return _testView;
}

崩溃的直接原因:运行时安全防护

若在 对象dealloc 过程中尝试创建新的该对象弱引用(如 __weak typeof(self) weakSelf = self):

  1. 运行时检查对象状态 storeWeak 函数会检测对象是否处于 deallocating 状态(通过 objc_destructInstance 函数标记)。
  2. 主动触发崩溃 当检测到对象正在析构时,storeWeak 会调用 objc_fatal 抛出以下崩溃日志:
scss 复制代码
if (deallocating) {
    _objc_fatal("Cannot form weak reference to instance (%p) of class %s. 
                It is possible that this object was over-released, 
                or is in the process of deallocation.", 
                (void*)referent, object_getClassName((id)referent));
} // [2](@ref)

崩溃本质是运行时的主动防护,防止开发者访问即将失效的内存。

三. 治理

将对象dealloc里面的将子对象改为实例方法访问类似_testView这样的,或者确保父对象dealloc之前,一定调用过子对象的懒加载方法。

相关推荐
叽哥9 小时前
Flutter Riverpod上手指南
android·flutter·ios
用户091 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan1 天前
iOS26适配指南之UIColor
ios·swift
权咚2 天前
阿权的开发经验小集
git·ios·xcode
用户092 天前
TipKit与CloudKit同步完全指南
ios·swift
法的空间2 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_915918412 天前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张2 天前
iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
android·安全·ios·小程序·uni-app·iphone·webview
Magnetic_h3 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
00后程序员张3 天前
详细解析苹果iOS应用上架到App Store的完整步骤与指南
android·ios·小程序·https·uni-app·iphone·webview