【问题标题】:How IBoutlet hold initial value being weak? Means some other strong object is pointing?IBoutlet 如何保持初始值较弱?意味着其他一些强大的物体正在指向?
【发布时间】:2019-12-16 03:39:36
【问题描述】:

我在 Storyboard 和 IBOutlet 的源代码中创建了一个按钮。

当我尝试重新初始化同一个插座时,它发出警告“实例将立即被释放,因为属性'按钮'是'弱'”

我明白这一点,因为没有强指针指向,所以它会释放。 但是一开始按钮是有价值的,如果它很弱,那么肯定有其他对象强烈指向它?

布局约束 IBOutlet 的类似情况。

在 button 的情况下,我认为它必须查看(但不确定)。

但是在布局约束的情况下会怎样。

如果我想通过以编程方式创建 UI 来实现相同的目标。

我的意思是,在 IB 创建 UI 的情况下,弱变量可以保持与持有相同的值。

提前致谢!

【问题讨论】:

  • 你是如何声明 IBOutlet 的?以及如何重新初始化同一个插座?

标签: ios interface-builder automatic-ref-counting weak-references


【解决方案1】:

从情节提要加载场景时,在将引用分配给@IBOutlet 属性之前,该按钮将添加到视图层次结构中。由于按钮位于视图层次结构中,因此对其有很强的引用。

当你说类似的话

self.buttonOutlet = UIButton() 

对新按钮的唯一引用是一个弱属性,编译器会警告您该对象将被立即释放。

您可以使用局部变量来保存强引用,直到将按钮添加到视图层次结构中。

let newButton = UIButton()
self.view.addSubview(newButton)
self.buttonOutlet = newButton

【讨论】:

  • 让 newButton = UIButton(); self.buttonOutlet = newButton;为什么还是没有警告?甚至视图没有任何参考。
  • 因为newButton 持有强引用。如果newButton 在您将其添加为子视图之前超出范围(例如返回的函数),则该对象将被释放(但您不会收到警告)
  • #Paulw11 还有一个疑问,假设我在某个内部视图中创建了一个具有恒定约束的按钮(比如前导 10、前 10、宽度 50、高度 20)并为约束创建了出口(假设仅宽度)。这也将是弱的那么它(宽度约束)是如何存在的,其他指向相同约束的强指针是什么?因为这个约束与视图或按钮以外的任何组件无关。
  • 按钮对约束有强引用。按钮的superview对按钮有强引用
猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多