UINavigation setViewControllers:内存分配

Posted

技术标签:

【中文标题】UINavigation setViewControllers:内存分配【英文标题】:UINavigation setViewControllers: memory allocation 【发布时间】:2012-09-06 13:18:23 【问题描述】:

我在导航控制器上使用 setViewControllers,例如:

XYZController *xyz = [XYZController alloc] initWithXibName:@"XYZController"];
[myNavController setViewControllers:xyz];
[xyz release];

我正在检查仪器中的分配,但是我发现如果此函数被调用 5 次,仪器中的实时对象调用次数会增加, #live 中会显示 5 次。

这意味着它正在分配内存,我如何处理内存分配。


编辑

RootViewController *rootController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootController];
[rootController.navigationController.navigationBar setHidden:YES];
[self.myNavController setViewControllers:nil];
[self.myNavController setViewControllers:[NSArray arrayWithObjects:navController,nil]];
[rootController release];
[navController release];

这是我在应用程序中使用的实际代码。这里的问题是,每当调用这段代码时,仪器中的 rootController 活对象计数总是会增加。不仅rootController数量增加,而且类变量也没有释放,因此内存堆积。结果是我的应用程序的性能在很大程度上降低了。

请就此提出建议。

【问题讨论】:

【参考方案1】:

首先,仪器在查看内存分配时通常会提供误报,因此我会对这些警告持保留态度。它不应该安装,因为(除了您的代码的错误之外)它看起来对我来说相当有效。

其次,您的代码不正确,因为 myNavController(我假设是 UINavigationController)在调用 setViewControllers 时会崩溃,因为它需要 UIViewController 的数组,而不是像您那样的单个视图控制器多于。这很可能会崩溃,甚至无法编译。

检查您的代码是否有效并再次运行仪器。如果您仍然有同样的问题,它可能只是误报,应该被忽略。

【讨论】:

感谢您的快速回复。 myNavControllerUINavigationControllersetViewControllers 仅包含单个视图控制器。【参考方案2】:

确保您没有在(NSZombiesEnabled 参数或在方案诊断中)使用僵尸时测试内存使用情况。默认情况下,僵尸永远不会被删除。

【讨论】:

以上是关于UINavigation setViewControllers:内存分配的主要内容,如果未能解决你的问题,请参考以下文章

关闭 UIAlertController 时调用 UINavigation 的 dismissViewControllerAnimated 方法

UINavigation 标题颜色变化问题

UINavigation 后退栏按钮

应用程序的 ios 11 颜色(uinavigation)

iOS关于UITabView和UIAlertController,UIAlertAction以及UINavigation,值修改的传递页面推送

呈现页面时出现 UiNavigation 错误