设置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

