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

设置translatesAutoresizingMaskIntoConstraints=false导致多个对象立即销毁的问题

问题成因分析

咱们来拆解一下你遇到的这个问题,核心原因可以分成两个关键点来看:

  • layoutSubviews被频繁触发,且被错误用来创建对象
    layoutSubviews这个方法的设计初衷是用来调整子视图的布局位置和尺寸,而非初始化或创建新视图对象。Auto Layout在计算约束的过程中,会多次调用这个方法——尤其是当你给button设置translatesAutoresizingMaskIntoConstraints = false之后,Auto Layout需要为这个按钮计算并应用约束,这个过程会触发父视图(也就是你的MyView)多次执行布局更新,导致layoutSubviews被调用的次数显著增加。

    而你的代码在layoutSubviews里每次都执行nextView = NextView(view: self),这意味着每次布局都会创建一个新的NextView实例,同时旧的NextView实例因为失去了nextView这个强引用,会被ARC(自动引用计数)立即标记为可销毁对象,也就出现了你看到的“多个立即被销毁的对象”现象。

  • translatesAutoresizingMaskIntoConstraints = false触发更多布局周期
    当你注释掉这行代码时,button会使用自动生成的autoresizing mask来适配布局,Auto Layout的计算量更小,layoutSubviews被调用的次数也更少,所以创建和销毁的NextView实例数量不多,可能没那么明显。但当你开启这行代码后,Auto Layout需要为button处理自定义约束,会触发更多的布局迭代,直接导致layoutSubviews被调用的次数暴增,对应的NextView实例创建销毁也变得频繁起来。

额外优化建议

解决这个问题的核心是把NextView的创建逻辑从layoutSubviews里移出来,比如放到commonLoad方法中,只在视图初始化的时候创建一次,这样就不会重复创建对象了。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:26