【问题标题】:dealloc not called when i used addChildViewController当我使用 addChildViewController 时没有调用 dealloc
【发布时间】:2013-08-18 16:48:13
【问题描述】:

我正在使用下面的代码将视图添加为addChildViewController

VideoListVC * videoListVC = [[VideoListVC alloc] initWithNibName:@"VideoListVC" bundle:nil];
UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController:videoListVC];
navController.view.frame = self.view_Container.bounds;
videoListVC.view.frame = navController.view.bounds;

[self addChildViewController:navController];
[navController didMoveToParentViewController:self]
[self.view_Container  addSubview:navController.view];

self is MenuVC 我将多个ViewControllers 添加为childview。我将MenuVC 称为pushViewController,所以当我在MenuVC 中时,我可以看到VideoListVC 作为子视图。当我调用popViewControllerAnimated 时,dealloc 方法未调用MenuVC 以及VideoListVC。所以问题是ViewController 内存没有释放,因此应用程序内存不断增加。最后,当我在应用程序周围不断20 to 25 min 时,应用程序崩溃了。

解决这个问题的方法是什么?我试过removeFromParentViewController,但没有成功。

addChildViewController 的代码有什么问题吗??

【问题讨论】:

  • 忘记最后一条评论:这是?:UINavigationController * navController = [[UINavigationController alloc] videoListVC];?我不相信 UINavigationController 会响应此方法。
  • @Abizern 是的。这是我的错。现在看到这个。有什么想法吗?
  • 而不是将导航控制器添加为子视图控制器(因为它占据了整个屏幕)以模态方式显示它。使用presentViewController:animated:completion: 显示它并使用dismissViewControllerAnimated:completion: 关闭它
  • @Abizern 我看起来像 Tabbar。在底部有 13 个菜单选项显示,如选项卡,它将是水平屏幕。当我点击每个项目时,新的视图控制器将在剩余的屏幕区域打开。所以我可以打开它“presentViewController:animated:completion”。

标签: iphone ios5 memory-management uiviewcontroller dealloc


【解决方案1】:

1) 你的第二行应该是

UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController:videoListVC];

2) 如果你不使用 ARC,你应该在最后释放你的 VideoListVC 和 navController,因为 videoListVC 由于 initWithRootViewController 调用而被保留,而 navController 由于 addChildViewController 被保留。

3) 我不知道这是否重要,但 Apple 的 View Controller Programming Guide for iOS 的清单 14-1 显示了添加 childVC 时的另一个序列:

 [self addChildViewController:content];                 // 1
 content.view.frame = [self frameForContentController]; // 2
 [self.view addSubview:self.currentClientView];
 [content didMoveToParentViewController:self];          // 3

希望这会有所帮助。

【讨论】:

  • 谢谢。我正在尝试你的方式。 ARC 在我的应用中开启。
  • 完成。来自参考链接中的“主题:实现自定义容器视图控制器”。谢谢
  • "因为 videoListVC 由于 initWithRootViewController 调用而被保留" 不,返回保留实例的是 alloc
  • @newacct 是的,当然 alloc 返回一个保留的实例。但是由于 initWithRootViewController 保留了 videoListVC,因此您可以在此调用之后安全地释放实例,而无需调用 dealloc。
  • @Tafkadasoh 我已经根据您的 sugetion 链接中的典型“清单 14-1”和“清单 14-2”实现了代码。删除我的子 viewcontroller 代码不正确,所以当我从 1 UIViewController 移动到 2nd UIViewController 时 - 未调用 dealloc 方法。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
相关资源
最近更新 更多