iOS: UIView 是否持有对其 UIViewController 的引用?

iOS: Does an UIView hold an reference to its UIViewController?

默认情况下,UIView returns 其在 nextResponder 函数中的 UIViewController - 如果它有一个。我认为 UIView 必须持有对 UIViewController 的引用。

如果是这样,会不会导致它们之间的循环引用,因为 UIViewController 也持有对 UIView 的引用?

---更新----------

我注意到 UIView 有一个名为 _viewDelegate 的私有成员,它是 UIViewController。有人知道这是怎么分配的吗?

---更新----------

我发现当view被加载并赋值给view controller时,它的_viewDelegate 属性同时指向了view controller。所以这可能发生在 view 属性.

didSet 事件中

根据属性_viewDelegate的名字,应该是一个delegate,我猜一般是weak引用

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?

这是最简单意义上的循环引用,但不一定是强引用循环保留循环。也就是说,内部参考可以是 weakunsafe_unretained 或在适当的时候手动设置为 nil

不过,可能并不总是有存储的引用。像这样的代码可以遍历响应链并找到最近的视图控制器:

// self is the view

UIResponder *responder = self;
while ((responder = [responder nextResponder])) {
    if ([responder isKindOfClass:UIViewController.class]) break;
}
return (UIViewController *)responder;

(代码来自 UIView+PSPDFKitAdditions.m。)

您看到的引用可能是延迟加载的,或者只是临时缓存的值。