iOS:UIView 是不是持有对其 UIViewController 的引用?
Posted
技术标签:
【中文标题】iOS:UIView 是不是持有对其 UIViewController 的引用?【英文标题】:iOS: Does an UIView hold an reference to its UIViewController?iOS:UIView 是否持有对其 UIViewController 的引用? 【发布时间】:2015-08-29 16:19:55 【问题描述】:默认情况下,UIView 在nextResponder
函数中返回它的 UIViewController - 如果它有一个。我认为 UIView 必须持有对 UIViewController 的引用。
如果是这样,会不会导致它们之间的循环引用,因为 UIViewController 也持有对 UIView 的引用?
---更新-----------
我注意到 UIView 有一个名为 _viewDelegate
的私有成员,即 UIViewController。有人知道这是怎么分配的吗?
---更新-----------
我发现当视图被加载并分配给视图控制器时,它的_viewDelegate
属性同时指向了视图控制器。所以这可能发生在view
属性的didSet
事件中。
根据_viewDelegate
属性的名称,应该是一个委托,我猜它通常是一个weak
引用。
【问题讨论】:
这是一个弱引用。 @i_am_jorf 你在哪里看到记录的? ivar name 的属性是什么? 我没有。我正在使用我的精神力量。一般来说,委托模式需要对委托的弱引用。可能是它很强大,并且它们以其他方式破坏了循环引用,毕竟视图控制器代码可能早于 ARC。你为什么这么担心?您是否遇到泄漏?你问是因为你想实现类似的东西并确保你做正确的事吗? 这只是提出了一个问题,即没有UIViewControllerDelegate
。你在哪里看到UIView
持有对UIViewControllerDelegate
的弱(或其他类型)引用的任何文档。 UIViews
不必有 UIViewController
。我关心的是正确性(我不是 OP BTW)。
【参考方案1】:
UIView 是否持有对其 UIViewController 的引用?
UIView 可能持有也可能不持有对 UIViewController 的引用,但这是一个内部实现细节。它没有记录在案,不应依赖。
如果是这样,会不会导致它们之间的循环引用,因为 UIViewController 也持有对 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.)
您看到的引用可能是延迟加载的,或者只是临时缓存的值。
【讨论】:
以上是关于iOS:UIView 是不是持有对其 UIViewController 的引用?的主要内容,如果未能解决你的问题,请参考以下文章