【问题标题】:Why set retain on @property for subviews?为什么要在 @property 上为子视图设置保留?
【发布时间】:2013-02-02 11:06:00
【问题描述】:

两部分相当简单的问题。

  1. 如果视图保留其子视图,并且我们在 Interface Builder 中创建视图层次结构,其中视图嵌套在其他视图中,为什么需要将嵌套子视图的 IBOutlet 属性设置为保留?不会为这些子视图属性分配一个可接受的参数吗?

  2. 我有一个 UIView 子类,它在初始化时向自身添加了一些子视图。要捕获对特定子视图的引用,@property (nonatomic, assign) 足以满足该需求,对吗?例如,主 UIView 添加了一个玩家得分子视图,然后想要与该玩家得分对话以更新它。只需要分配那个引用,因为视图本身是由 UIView 类自动保留的,对吧?

【问题讨论】:

  • 相关阅读:Does IBOutlet imply weak?
  • 啊,完美。我觉得我已经充分阅读了 Apple 的文档,但答案就在那里。

标签: ios cocoa properties retain assign


【解决方案1】:

是的,确实,在您的情况下,子视图将被视图保留,因此我们在技术上不需要再次保留它。然而,这有点脆弱。如果将来您添加一些从其父视图中删除该子视图的代码怎么办?然后你有一个悬空指针,除非你确保它为零。

保留实例变量是一般惯例,除非必须不保留(例如,对于委托)。如果我们说“哦,我们不需要保留这个实例变量,因为它保留在这里;哦,我们确实需要保留另一个,因为它没有保留;等等”,那么我们最终会非常随意内存管理,每次我们添加一个实例变量,我们都要去思考它是否被其他东西保留;然后每次我们使用它时,我们必须记住我们是否决定保留它。这正是内存管理规则旨在避免的那种内存管理噩梦。

而保留实例变量,有什么害处呢?在这种情况下,它只是在我们分配它时导致额外的保留和释放。没什么大不了的,为了简单和一致。

【讨论】:

  • “想想它是否被其他东西保留” 我会谦虚地争辩说,这正是我们应该考虑的。事实上,苹果文档在上面的链接中明确建议保留对不在对象保留层次结构顶层的 IBOutlets 的弱引用。
【解决方案2】:

1) 不需要。 assign 很好。是什么让你认为你使用retain

2) 是的

顺便问一下,您使用的是 ARC 吗?如果是这样,请使用weak而不是assign(请不要问为什么,在堆栈溢出的各个角落和互联网上都有很好的解释)。

【讨论】:

  • 当前项目不是 ARC,所以这就是为什么我在保留/分配的上下文中专门提出了这个问题。感谢您考虑与我确认弱/强。我不认为我必须使用保留,但我意识到我已经养成了这样做的习惯并且无法解释为什么。当我开始质疑自己时,我意识到我需要整个社区的确认。另一方面,我觉得开发人员经常被告知(例如通过在线教程)发布 IBOutlets,这意味着保留,它具有相反的含义,即必须始终保留每个 IBOutlet。
  • 任何告诉您始终发布某些内容的在线教程都不应该被信任。任何 retained 属性都必须释放,就像任何保留的 IBOutlet 必须一样。 IBOutlets 可以用于视图之外的其他东西,如果它是顶级对象,它将立即被释放,而不是保留属性。
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2016-04-16
  • 2014-03-20
  • 2014-02-17
  • 1970-01-01
相关资源
最近更新 更多