打开新控制器后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内存错误
修复方案
- 将
dimmedBaclroundView改为懒加载存储属性,确保全局只有一个实例:
lazy var dimmedBaclroundView: UIView = { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = UIColor.black.withAlphaComponent(0.3) return view }()
- 修正拼写错误:
dimmedBaclroundView建议改为dimmedBackgroundView(少了字母k),提升代码可读性 - 修正高度约束逻辑:如果是要设置为父视图高度的30%,应该用
multiplier而非constant(constant是固定偏移值):
CView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.3)
内容的提问来源于stack exchange,提问作者Captain Grimm
相关产品推荐
相关产品推荐

