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?
这是最简单意义上的循环引用,但不一定是强引用循环或保留循环。也就是说,内部参考可以是 weak
或 unsafe_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。)
您看到的引用可能是延迟加载的,或者只是临时缓存的值。
默认情况下,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?
这是最简单意义上的循环引用,但不一定是强引用循环或保留循环。也就是说,内部参考可以是 weak
或 unsafe_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。)
您看到的引用可能是延迟加载的,或者只是临时缓存的值。