视图会自动保留添加到视图的子视图。假设您想要一个指向同一子视图的单独指针,因此您无需经常通过其标记检索它。
这种情况需要什么类型的@property
?我假设将属性设置为retain
不是一个好主意,因为主视图已经保留了它?它应该是assign
吗?
或者,除非您打算稍后重新分配或使用点表示法引用它,否则此处完全没有使用@property
?
答案 0 :(得分:2)
您可以使用retain
或assign
。
当然,如果您使用retain
,则必须将该属性设置为nil
或在viewDidUnload
和dealloc
中释放其对象。
有些人更喜欢retain
的原因是因为这意味着该属性在viewDidUnload
中仍然有效。因此,如果您要进行其他清理,并且清理需要视图仍然存在,则可以在viewDidUnload
中执行此操作。
如果您使用assign
,则不必在nil
和viewDidUnload
中将该属性设置为dealloc
(尽管这是一种不错的做法)。但是,当您收到viewDidUnload
时,视图已经发布,因此您无法在此时使用该视图进行其他清理。相反,在调用didReceiveMemoryWarning
之前,您必须覆盖[super didReceiveMemoryWarning]
进行清理。
在iOS 5.0中,您可以在viewWillUnload
中进行清理,而不是覆盖didReceiveMemoryWarning
。
答案 1 :(得分:2)
考虑以下两点:
保留一个物体几次没有问题,前提是每个保持与释放平衡。关于属性,这只意味着你应该在完成属性后将你的属性设置为nil。
Objective-C中内存管理背后的基本思想是,您担心会保留您正在使用的对象,并让其他对象担心他们正在使用的对象。
考虑到这些,我主张使用retain。如果您依赖于视图保留其子视图的事实,您突然使您的代码依赖于外部行为。我并不是说UIView可能会停止保留其子视图,但如果您保留对子视图的非保留引用,并且稍后从其超级视图中删除该子视图,那么您的代码可能会崩溃。
当一些人知道那些子视图永远不会被删除时,他们会使用assign指向子视图的出口。就个人而言,我不认为依靠另一个物体为你保留一些东西,而你自己保留的东西是如此简单和便宜。