gpt4 book ai didi

iphone - UIView的addSubview真的保留了view吗?

转载 作者:行者123 更新时间:2023-12-03 18:26:44 28 4
gpt4 key购买 nike

我遇到的情况似乎表明情况并非如此。在下面的代码片段中,如果我删除该行: self.navigationController = nav,根 Controller 的 View 将不会显示,这表明 addSubview 实际上可能不会按照其他建议保留 View 。有什么想法吗?

- (void)applicationDidFinishLaunching:(UIApplication *)application {   
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.testViewController];

self.navigationController = nav; //<-- if this line is removed, test view won't show up

[window addSubview:nav.view];

[nav release];
}

最佳答案

这一行:

[window addSubview:nav.view];

不会立即将 View 添加到屏幕。它由操作系统在未来的某个可能不同线程上的运行循环中显示。我们无法确定实际的实现情况。

这就是为什么 Apple 定义了像 viewDidAppear/viewWillAppear 这样的委托(delegate)方法,否则我们就不需要它们,因为我们可以准确地知道这些事件何时发生。

此外,正如您所说,添加 subview 确实保留了 View 。但它保留 View Controller 或导航 Controller 。由于导航 Controller 保留任何添加的 View Controller ,因此我们不必使用 ivar 支持它们。

但是,您对导航 Controller 的引用必须持续超出该方法的范围。或者根据您的代码,它可能会被释放或丢失其引用。

因此,您必须使用 ivar 保留对导航 Controller 的引用并按如下方式设置:

self.navigationController = nav; 

因此,即使 nav.view 包含指向 testViewController.view 的指针,应用程序也不会引用导航 Controller ,进而引用 View 。结果是空白屏幕。

<小时/>

为了更明显地表明这不是保留/释放问题,您实际上是在以下方法中泄漏:

self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];

您需要通过以下方式自动释放来平衡保留/释放:

self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];

因此,这意味着您的 View 在您运行此代码时从未被释放过。这进一步向我们保证您的问题确实是一个丢失的引用。

关于iphone - UIView的addSubview真的保留了view吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937767/

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