快速提问:我ViewController
的IBOutlet
for aUILabel
会ViewController's view
自动持有对标签的强引用吗?而且,如果我以编程方式创建一个UIPopoverController ivar
输入ViewController
并以UIPopoverController ivar
编程方式将其放在屏幕上也会ViewController's view
自动保持对它的强引用吗?
3 回答
您应该对不属于视图层次结构的任何视图保持强引用。您的视图控制器已经对其view
属性(主视图)具有强引用,并且所有子视图都将由其父视图保留,因此您实际上不需要对它们进行强引用,您可以对这些视图进行弱引用。
但是,如果您有任何不在主视图中的视图(例如,在 .xib 文件中定义的附加视图,您稍后可能会添加到主视图中,或者您想要删除的子视图之一并以编程方式重新添加),那么您应该对这些视图有强烈的参考。
另请注意,当您在视图控制器中持有对视图的强引用时,您应该设置它self.strongViewRef = nil
,viewDidUnload
因为在卸载视图时不需要它(例如,当视图控制器在后台时,例如被另一个完整的-屏幕视图)。再次加载视图时,该属性将自动重新设置为该视图的新实例。
关于弹出框,它会在呈现时保留(window
我认为),但我建议您在需要时保持对它的强引用,然后nil
在完成后将该指针设置为。通过这种方式,您可以保证您可以在需要时访问它,在某些情况下,这可能是在它呈现之前或在它被关闭之后。
苹果现在建议保留对通过界面构建器创建的视图的弱引用,除了根单一视图层次结构将负责保留视图
但是,如果您手动创建它,您希望在将新创建的视图添加到视图层次结构之前至少具有局部强变量,然后您可以将其分配给弱 ivar,这样它就不会在分配给弱 ivar 后立即丢失,例如:
// Somewhere in .h
__weak UIView *_myView;
// Somewhere in .m
_myView = [[UIView alloc] init];
[self.view addSubview:_myView];
没有多大意义,_myView
会立即丢失
// Somewhere in .h
__weak UIView *_myView;
// Somewhere in .m
UIView *myLocalView = [[UIView alloc] init];
[self.view addSubview:myLocalView];
_myView = myLocalView;
非常安全,因为您分配了一个由视图层次结构本身管理的变量
UIPopoverController
,另一方面,根据文档,您应该始终保留(例如 __strong ivar)。不仅如此,如果您不保留它,您将遇到一个令人讨厌的错误。
您不需要使出口变得强大,因为视图控制器应该被强烈持有,一旦它消失,就没有理由坚持出口,因为视图不再存在,所以出口弱就可以了。该视图本身具有指向它们的强指针。
编辑:抱歉忘了说是的,你应该保持指向popovercontroller的强指针