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之前,一定调用过子对象的懒加载方法。

相关推荐
for_ever_love__12 小时前
UI学习:UICollectionView瀑布流
学习·ui·ios·objective-c·cocoa
大熊猫侯佩16 小时前
WWDC26 全网首发:SwiftUI 8 “可重排序“操作符深度解析
ios·swiftui·swift
邓小乐17 小时前
Workaround: Xcode27 下载iOS 27.0 Simulator
ios·xcode
韩曙亮17 小时前
【Flutter】Flutter 中的 Android / iOS 特殊配置 ① ( 网络权限配置 | HTTP 明文传输配置 | 应用名称配置 )
android·网络·flutter·http·ios·网络权限
人月神话-Lee19 小时前
【图像处理】颜色空间——RGB之外的世界
图像处理·人工智能·ios·ai编程·swift·rgb·颜色空间
CocoaKier20 小时前
苹果后台年龄分级填写错误,可能导致审核被拒!
ios·apple
月诸清酒20 小时前
Codex 现在能在浏览器里跑 iOS 模拟器了
ios
武子康21 小时前
调查研究-159 Apple WWDC 2026 定档 6/8-12:Siri 与 AI 升级,可能是苹果最关键的一次
人工智能·深度学习·ios·ai·chatgpt·apple·wwdc
2601_961194021 天前
27考研资料|百度网盘|夸克网盘
android·xml·考研·ios·iphone·xcode·webview