iOS:UIView 是否保留对其 UIViewController 的引用?

标签 ios uiview uiviewcontroller

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

如果是这样,会不会导致它们之间出现循环引用,因为 UIViewController 也保存了对 UIView 的引用?

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

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

enter image description here

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

我发现当 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?

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

相关文章:

ios - 自动完成搜索 Swift 的 Google 说明

ios - 除非我添加另一个 UIView,否则 ScrollView 中的 TableView 为空?

c# - Xamarin.forms - Masterdetailpage : System. Reflection.TargetInvocationException:调用目标引发了异常

iphone 在圆圈上绘制阴影

ios - UIScrollView 不滚动

ios - 我应该先为 View 层编写测试(在 TDD 之后)还是只进行手动测试并在完成后添加快照测试?

ios - Xcode 将 iOS 应用归档为 Mac 应用

ios - 如何将 UITableView Wrapper 的大小调整为与 UITableView 相同的大小?

ios - 设置 UITableView 委托(delegate)和数据源时的最佳实践

iOS/Swift/Spritekit 在我在该 View Controller 中呈现新场景后,场景是否会删除数据?