快速提问:我的ViewController
IBOutlet
UILabel
ViewController's view
会UIPopoverController ivar
自动保留对标签的强引用吗?而且,如果我以编程方式在ViewController
中创建UIPopoverController ivar
并以编程方式将ViewController's view
放在屏幕上,{{1}}会自动保留对此的强引用吗?
答案 0 :(得分:4)
您应该对不属于视图层次结构的任何视图保持强引用。您的视图控制器已经强烈引用其view
属性(主视图),并且所有子视图将由其超级视图保留,因此您实际上不需要对它们保持强引用,您可以保持弱参考这些观点。
但是,如果您有任何视图不在主视图中(例如,.xib文件中定义的其他视图,您可能会在以后某个时间点添加到主视图中,或者您的其中一个子视图想要以编程方式删除和重新添加)那么你应该对这些视图有强烈的引用。
另请注意,当您在视图控制器中保留对视图的强引用时,应在self.strongViewRef = nil
中设置viewDidUnload
,因为在卸载视图时不需要它(例如,视图控制器在后台,例如,被另一个全屏视图遮挡)。当再次加载视图时,该属性将自动重新设置为该视图的新实例。
关于popover,它会在呈现时保留(我认为是window
)但是我建议在你需要时保留一个强引用,然后将指针设置为{{1}一旦你完成了它。通过这种方式,您可以保证在需要时可以访问它,在某些情况下可能会在它出现之前或仅在它被解雇之后访问它。
答案 1 :(得分:1)
Apple suggests现在要保存对通过界面构建器创建的视图的弱引用,除了根视图层次结构将保留视图
但是,如果您手动创建它,您希望在将新创建的视图添加到视图层次结构之前至少具有本地强变量,然后您可以将其分配给弱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)。如果你不保留它,你会发现一个令人讨厌的错误。
答案 2 :(得分:0)
你不需要设置一个强大的插座,因为视图控制器应该被强有力地保持,一旦它消失,没有理由坚持插座,因为视图不再存在,所以出口弱了是精细。视图对它们本身有很强的指针。
编辑:抱歉忘记说是的,你应该保留强大的指向popovercontroller的指针