【问题标题】:Swift IBOutlet collections and retain cycle safetySwift IBOutlet 收集并保持循环安全
【发布时间】:2017-04-13 17:26:20
【问题描述】:

一段时间以来,我一直在尝试在 MacOS 项目中使用 Swift 插座集合,但我才知道目前这是不可能的。我仍然不明白为什么不这样做,但假设这在某个时候被修改了,我还有另一个担心。

我知道,除了“根”出口外,出口通常应该很弱,以防止保留循环:

@IBOutlet weak var someButton: NSButton!

但是我为集合语法找到的示例不包括弱修饰符,而且我还没有找到一个地方来放置它(1)是有意义的,并且(2)没有得到一个危险信号:

@IBOutlet var severalButtons: [NSButton]!

那么,我是否遗漏了一些明显的东西?我可以确定这样的出口集合不会创建保留周期吗? (假设他们曾经被允许?)

【问题讨论】:

  • 没有理由让网点weak,他们没有创建参考循环。

标签: swift macos retain-cycle iboutletcollection


【解决方案1】:

IBOutletCollectionIBActionIBOutlet 不同,它将类名作为参数。作为顶级对象,IBOutletCollection 应声明为强对象。这在here有更详细的解释。

因此,由于此限制,IBOutletCollection 有可能创建保留周期。

【讨论】:

  • 我认为我们在同一页上:我确实理解集合本身必须具有强引用,并且您确认我怀疑集合数组中的强引用可能会导致问题,如果我不小心。但在我的情况下,该集合将由接口根对象拥有(目前是假设的,因为 MacOS)。所以接口内的所有权不再是一棵简单的树,而是一个有向无环图。但我想我会没事的,因为所有权仍然是“非循环的”。
  • @JeffJ 很高兴你能理解。那你在寻找什么答案?
  • 我想你已经尽可能地回答了我。我担心我遗漏了一些东西,因为集合的 Swift 语法似乎不允许设置弱出口引用的可能性,这看起来仍然很奇怪。除非你想弄清楚为什么 IB 似乎无法识别 MacOS 项目中集合的存在,而我被告知它在 iOS 项目中做得很好?否则,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2021-08-14
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
相关资源
最近更新 更多