You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打开新控制器后App崩溃求助:EXC_BAD_ACCESS错误排查

iOS App崩溃排查与修复

问题描述

App启动后点击打开新控制器时崩溃,错误信息:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x1d27fc844)
崩溃触发点在NSLayoutConstraint.activate(constants)代码行。

问题代码

var dimmedBaclroundView : UIView {
    let view = UIView()
    
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = UIColor.black.withAlphaComponent(0.3)
    return view
}

lazy var CView = CustomView { [weak self] in
    guard let self = self else {return}
    self.dismiss(animated: true, completion:  nil)
    
}

init() {
    super.init(nibName: nil, bundle: nil)
    modalPresentationStyle = .overCurrentContext
    modalTransitionStyle = .crossDissolve
    
}

required init?(coder:NSCoder) {
    fatalError("init(coder :) has not been implanted")
}



override func viewDidLoad() {
    super.viewDidLoad()

    view.addSubview(dimmedBaclroundView)
    view.addSubview(CView)
    
    
    var constants = [
        dimmedBaclroundView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        dimmedBaclroundView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        dimmedBaclroundView.topAnchor.constraint(equalTo: view.topAnchor),
        dimmedBaclroundView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
    ]
    
    constants.append(contentsOf: [
        CView.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor),
        CView.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor),
        CView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 10),
        CView.heightAnchor.constraint(equalTo: view.heightAnchor, constant: 0.3)
    ])
    
    NSLayoutConstraint.activate(constants) // 崩溃位置
}

问题原因

核心错误是dimmedBaclroundView被定义为计算属性:

  • 每次访问该属性,都会创建一个全新的UIView实例
  • view.addSubview(dimmedBaclroundView)添加的是第一个实例,而后续创建约束时访问dimmedBaclroundView生成的是第二个未加入视图层级的实例
  • 激活约束时,系统无法找到这个孤立视图的有效上下文,直接触发EXC_BAD_ACCESS内存错误

修复方案

  1. 将dimmedBaclroundView改为懒加载存储属性,确保全局只有一个实例:
lazy var dimmedBaclroundView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = UIColor.black.withAlphaComponent(0.3)
    return view
}()
  1. 修正拼写错误:dimmedBaclroundView建议改为dimmedBackgroundView(少了字母k),提升代码可读性
  2. 修正高度约束逻辑:如果是要设置为父视图高度的30%,应该用multiplier而非constant(constant是固定偏移值):
CView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.3)

内容的提问来源于stack exchange,提问作者Captain Grimm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:03:26