gpt4 book ai didi

iphone - UINavigationController 和 UIViewController 释放

转载 作者:行者123 更新时间:2023-12-03 19:35:32 24 4
gpt4 key购买 nike

我最近更改了我的应用程序以使用 UINavigationController,之前我使用的是 UINavigationBar,添加了级联 subview ,这有点脆弱。

我面临内存使用问题。 Leaks 工具没有显示任何泄漏,但我创建并添加到 UINavigationController 的 ViewController 似乎从未被释放。因此,每次我创建一个新的 VC,然后按下 NavigationController 的后退按钮时,内存使用量都会增加。

我只需这样创建并添加我的 VC:

DetailViewController* detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
// setups
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];

应用程序永远不会执行 ViewController 的 deallocviewDidUnload 方法。每次我按后退按钮时不应该调用这些吗?

我查了很多教程,也看了Apple的内存管理,但是没有任何关于使用NavigationController时VC在内存中的生命周期的内容。

最佳答案

也许您没有做错什么,而是面临类似 this 的情况。

博客文章中提出了我们是否必须手动释放 IBOutlets 的问题。事实证明我们应该这样做。这在 iOS 3.1.3 中是可以重现的,但我还没有在 iOS 4.0 中进行测试。

第二种方法是重写 View Controller 的保留和释放方法并打印出保留计数。我有一个类似的问题,一些 View Controller 的 dealloc 方法没有调用,所以我重写这个方法来看看是否有人仍然保留它。事实证明确实如此。

编辑:
当我打印保留计数时,由于框架的原因,它有时会达到 ~98,所以不必担心。

如果你最后的保留计数保持在 2 并且 dealloc 方法不会被调用,那么有人仍然保留它。

在这种情况下,您应该在其他地方搜索。

例如我在同一问题中遇到的另一个问题:有时我会使用

[NSTimerchedTimerWithTimeInterval:1.0 目标:self 选择器:@selector(updateUI) userInfo:nil 重复:YES]

不断更新用户界面。但我忘记的是,NSTimer 将保留 target 对象(即 ViewController)。因为 NSTimer 保留了你的 View Controller ,所以你的 dealloc 永远不会被调用,因为某人(NSTimer)仍然保留它。因此,您必须确保在 dealloc 方法之前使 NSTimer 无效才能正确释放 View Controller 。

编辑2回应以下评论:
保留声明的属性的作用如下(示例):

- (void)setTarget:(id)value {
if (value != target) {
[target release];
target = [value retain];
}

所以它首先释放当前的 self.target 然后保留新值。由于您分配的是 nil,因此您的目标之后将为零。有关属性的更多信息可以在 Apple 文档中找到。

关于iphone - UINavigationController 和 UIViewController 释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3230230/

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