3

相当简单的问题分为两部分。

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

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

4

2 回答 2

2

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

2) 是的

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

于 2013-02-18T04:15:02.457 回答
1

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

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

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

于 2013-02-18T19:51:15.617 回答