相当简单的问题分两部分。
如果视图保留其子视图,并且我们在Interface Builder中创建了一个视图层次结构,其中视图嵌套在其他视图层次结构中,为什么需要将嵌套子视图的IBOutlet属性设置为保留?不会为这些子视图属性分配可接受的参数吗?
我有一个UIView子类,它在初始化时为自己添加了一些子视图。要捕获对特定子视图的引用,@ property(非原子,assign)就足以满足这种需要,对吗?例如,主UIView添加了一个玩家得分子视图,然后想要与该玩家得分进行对话以更新它。只需要分配该引用,因为UIView类会自动保留视图,对吗?
答案 0 :(得分:2)
1)不需要。 assign
没问题。是什么让您认为 使用retain
?
2)是的
顺便问一下,你在使用ARC吗?如果是这样,请使用weak
而不是assign
(请不要问为什么,在堆栈溢出和互联网的每个角落都能很好地解释它。)
答案 1 :(得分:1)
是的,在您的情况下,视图将保留子视图,因此我们在技术上不需要再次保留它。但是,这有点脆弱。如果您将来添加一些从超级视图中删除该子视图的代码,该怎么办?然后你有一个悬垂的指针,除非你确定把它弄清楚。
保留实例变量是一般约定,除非有必要(例如代表)。如果我们走的路是说“哦,我们不需要保留这个实例变量,因为它保留在这里;哦,我们确实需要保留另一个,因为它没有保留;等等”,然后我们最终会非常杂乱无章内存管理,每次我们添加一个实例变量时,我们都要考虑它是否被其他东西保留;然后每当我们使用它时,我们必须记住我们是否决定保留它。正是内存管理规则旨在避免的那种内存管理噩梦。
保留实例变量,它有什么危害?在这种情况下,它只会在我们分配时引起额外的保留和释放。这不是什么大问题,只是为了简单和一致。