无法激活NSLayoutConstraint,EXC_BAD_ACCESS错误修复求助
修复NSLayoutConstraint激活时的EXC_BAD_ACCESS错误
问题根源
你的profileImage是计算属性,每次访问它都会创建一个全新的UIImageView实例。在setUpView方法里,你先调用view.addSubview(profileImage)添加了一个实例,之后激活约束时又多次访问profileImage,每次拿到的都是新的、未被添加到视图层级的实例——这些实例的布局锚点无法参与有效布局,直接触发内存访问错误。
修复方案
方案1:将计算属性改为存储属性(固定初始图片)
把profileImage改成只初始化一次的存储属性,确保添加到视图和设置约束的是同一个实例:
class ProfileViewController: UIViewController { private var profileUser = katyPerry // 改为存储属性,仅初始化一次 private let profileImage: UIImageView = { let imageView = UIImageView(image: UIImage(named: katyPerry.login)) imageView.translatesAutoresizingMaskIntoConstraints = false return imageView }() override func viewDidLoad() { super.viewDidLoad() setUpView() } func setUpView() { view.addSubview(profileImage) NSLayoutConstraint.activate([ profileImage.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), profileImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 20), profileImage.heightAnchor.constraint(equalToConstant: 100), profileImage.widthAnchor.constraint(equalToConstant: 100) ]) } }
方案2:支持动态设置图片(适配随机用户逻辑)
如果需要动态修改profileUser并更新图片,先初始化空的存储属性,再在viewDidLoad中设置图片:
class ProfileViewController: UIViewController { private var profileUser = katyPerry private let profileImage: UIImageView = { let imageView = UIImageView() imageView.translatesAutoresizingMaskIntoConstraints = false return imageView }() override func viewDidLoad() { // 取消注释后可动态切换用户 // profileUser = users.randomElement() ?? User(login: "default", name: "default") profileImage.image = UIImage(named: profileUser.login) super.viewDidLoad() setUpView() } func setUpView() { view.addSubview(profileImage) NSLayoutConstraint.activate([ profileImage.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), profileImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 20), profileImage.heightAnchor.constraint(equalToConstant: 100), profileImage.widthAnchor.constraint(equalToConstant: 100) ]) } }
修复逻辑说明
存储属性仅在初始化时创建一次实例,添加到视图层级的控件和用于设置约束的是同一个对象,所有布局锚点都属于已加入视图树的有效控件,约束激活时不会出现无效内存访问。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

