gpt4 book ai didi

ios - 为什么 UINavigationController 和 UIViewControllers 之间没有保留循环

转载 作者:可可西里 更新时间:2023-11-01 03:06:12 28 4
gpt4 key购买 nike

情况:有 UINavigationController 和推送的 UIViewController。

1.UIViewController强引用UINavigationController

@property(nonatomic,readonly,retain) UINavigationController *navigationController

2.UINavigationController 将 View Controller 存储在 NSArray 中

@property(nonatomic,copy) NSArray *viewControllers;

UINavigationController 应该对这个 NSArray 有强引用(否则它将被释放)。

3.NSArray 对包含的 View Controller 有强引用。

更新:让我们想象一下代码中的某个地方,我们有以下内容:

UIViewController *A = [ [UIViewController alloc] init ];
UINavigationController *B = [ [ UINavigationController alloc ] initWithRootViewController:A ];
// Here we have strong reference in A to B, in B to B.viewControllers (count == 1) and in B.viewControllers to A.
// Local variable's strong references to A and B
A = nil; B = nil;
// Local variable's strong references has gone
// But we should still have retain loop here
// Magic !?? :)

我的问题是为什么我们这里没有保留循环?

最佳答案

2.UINavigationController stores view controllers in NSArray

这不是给定的。

@property(nonatomic,copy) NSArray *viewControllers;

这绝不表示有一个名为 _viewControllers 或类似名称的 ivar。它只是告诉我们有一些方法 -viewControllers 会返回一个 NSArray,还有一些方法 setViewControllers: 会接受一个,并暗示它将复制它(或者至少表现得像复制它一样)。这就是它告诉我们的全部。如果您在调试器中展开 NSNavigationController,您会注意到那里没有列出 _viewControllers ivar。

如果您稍作探索,您会发现 -viewControllers 并未实现为综合属性。它只是转发到 -childViewControllers(这是一个 UIViewController 属性)。好的,那不就解决了问题吗?我的意思是 -childViewControllers 实现为 [NSArray arrayWithArray:_childViewControllers]。很公平。你捕获了我。

但是同样的逻辑适用于[UIViewController navigationController]。本声明:

@property(nonatomic,readonly,retain) UINavigationController *navigationController

并不意味着它实际上具有强链接。这只是意味着如果您调用 setNavigationController:,您会希望它保留它。但是你不能调用 setNavigationController:。没有这样的方法(甚至没有私有(private)方法)。所以这一切真正有前途的是有一个名为 -navigationController 的方法。 作为对 +[UINavigationController _ancestorViewControllerOfClass:allowModalParent:] 的调用来实现。这只是传递给 UIViewController 实现,它沿着 parentViewController 链寻找 UINavigationController。所以没有保留循环;它是动态确定的。

但你的问题仍然是一个很好的问题。这里的头文件让 IMO 感到困惑,我会打开一个雷达来反对它。 navigationController 应该被列为 assign 或者它应该什么都不说(即使默认为 strong 它至少不会产生误导)。

顺便说一句,如果你对这些东西感兴趣,你真的应该花 90 美元购买 Hopper .它非常擅长这种探索。

关于ios - 为什么 UINavigationController 和 UIViewControllers 之间没有保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21960142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com