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 的引用?

这是最简单意义上的循环引用,但不一定是强引用循环保留循环。也就是说,内部引用可以是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.)

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

【讨论】:

以上是关于iOS:UIView 是不是持有对其 UIViewController 的引用?的主要内容,如果未能解决你的问题,请参考以下文章

模糊包含键盘及其下方内容的 UIView (iOS 7)

如何拖动 UIView 元素并更改位置?

iOS:UIView 在动画时改变大小,我该如何防止?

iOS - 以编程方式移动/裁剪 UIView

iOS Playgrounds 是不是支持 UIView 动画?

IOS开发 问一个spritekit问题