默认情况下,UIView 在 nextResponder
函数中返回其 UIViewController - 如果有的话。我认为 UIView 必须持有对 UIViewController 的引用。
如果是这样,会不会导致它们之间出现循环引用,因为 UIViewController 也保存了对 UIView 的引用?
--- 更新 -----------
我注意到 UIView 有一个名为 _viewDelegate
的私有(private)成员,它是 UIViewController。有人知道这是如何分配的吗?
--- 更新 -----------
我发现当 View 被加载并分配给 View Controller 时,它的_viewDelegate属性同时指向 View Controller 。所以这可能发生在 view
属性的 didSet
事件中。
根据属性_viewDelegate
的名称,它应该是一个委托(delegate),我猜它通常是一个弱
引用。
最佳答案
Does an UIView hold an reference to its UIViewController?
UIView 可能会也可能不会保存对 UIViewController 的引用,但这是内部实现细节。它没有记录在案,因此不应依赖它。
If so, won't it lead to a circular reference between them, since UIViewController also holds an reference to UIView?
这是最简单意义上的循环引用,但这不一定是强引用循环或保留循环。也就是说,内部引用可以是 weak
或 unsafe_unretained
或在适当的时间手动设置为 nil
。
不过,可能并不总是有存储的引用。像这样的代码可以遍历响应者链并找到最近的 View Controller :
// self is the view
UIResponder *responder = self;
while ((responder = [responder nextResponder])) {
if ([responder isKindOfClass:UIViewController.class]) break;
}
return (UIViewController *)responder;
(代码来自 UIView+PSPDFKitAdditions.m 。)
您看到的引用可能是延迟加载的,或者只是临时缓存的值。
关于iOS:UIView 是否保留对其 UIViewController 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32288159/