ARC 保留假人的循环



我的应用程序面临内存问题,

我有一个基于导航的应用程序,如果我推送、弹出和推送我所有的控制器,应用程序将因内存过载而关闭。

我认为这就是我们所说的保留周期:

我有一个自定义导航控制器:MyNavController,这个控制器是我的根控制器,并推送主UIViewControllerMyMainController,当应用程序启动应用程序时使用大约 130 MB 的内存,当我推送新控制器时:内存上升到 160 然后我弹出这个控制器:内存仍然是 160(确切地说是 159) 然后我推送另一个视图控制器: 内存高达190 MB...记忆永远不会消失。

  • 你能确认我这是一个保留周期吗?

  • 如果我在弹出视图控制器时没有错,则视图控制器内存大小应该会减小

  • 我总是在我的属性(按钮、视图、自定义视图、自定义对象......)中使用 strong 但是当我在 dealloc 方法的二级控制器中设置断点时,我知道它被调用了,所以应该释放控制器吗?

  • 我尝试了一些东西:我做了一个空UIViewController并将 xib 中的视图设置为我的一个未发布的控制器,所以它可能比清晰更重,所以这个控制器没有代码行,只是一个 .h 和 .m,没有自定义代码什么都没有,当我推这个控制器时,内存会上升,当我弹出它时,内存不会下降!我真的不明白我必须寻找什么,我必须在我的MainViewController上寻找吗?还是在控制器中我推堆栈?

我只需使用以下方法加载我的控制器:

GeoControllerViewController *aGeoController = [[GeoControllerViewController alloc] initWithNibName:@"GeoControllerViewController" bundle:nil];
aGeoController.dictionnaryModele = _dicCours;
[self.navigationController pushViewController:aGeoController animated:YES];

提前谢谢。

你问:

你能确认我这是一个保留周期吗?

不。可能是泄漏。可能是缓存。可能是一个保留周期。我们无法从您与我们分享的内容中得知。

如果我在弹出视图控制器时没有错,那么视图控制器内存大小的内存应该会减小吗?

通常,当您弹出时,它应该会减少,但是如果将缓存用于任何内容,或者填充共享模型或其他内容,则它可能不会完全返回到初始推送之前的内存级别。话虽如此,如果有缓存在起作用,如果您多次推送和弹出,您在分配中看到的总"活动字节"应该在推送和弹出几次后恢复到一致的水平。

我总是在我的属性(按钮、视图、自定义视图、自定义对象......)中使用 strong 但是当我在 dealloc 方法的二级控制器中设置断点时,我知道它被调用了,所以应该释放控制器吗?

如果调用了该控制器的dealloc,则告诉您这不涉及任何保留周期,并且与控制器关联的内存将由系统恢复。从理论上讲,它的任何强特性也应该被释放出来。

顺便说一句,通常您的IBOutlet引用(即由NIB/故事板创建的内容)应该在ARC项目中weak

<小时 />

一些具体的建议:

  1. 通过静态分析器运行代码(Xcode "产品"菜单上的"分析"),并确保那里没有警告。如果有,请先修复它们。

  2. 通过仪器中的泄漏工具运行代码,看看它是否报告了任何内容。如果是这样,那将告诉您如何继续。

  3. 如果仍然找不到问题,请使用"仪器"中的"分配"工具运行该工具,在转到下一个场景之前标记堆镜头/生成,转到下一个场景,返回,然后标记另一个堆镜头/生成。然后,您可以分析在这两个时刻之间分配和未释放的内容,这将告诉您随后要查找的内容。

    请参阅 WWDC 2012 视频 iOS 应用程序性能:内存,以获取有关如何执行此操作的一些演示。

坦率地说,130MB对于一般的开始来说似乎太多了。

  • 我对此不太确定。问题是:除了导航控制器中的控制器之外,您是否持有对控制器的任何引用?也可能是泄漏。为什么这些控制器消耗这么多内存?

  • 是的,内存消耗应该更低。

  • 我不知道我是否回答了你的问题。通常强属性是可以的,但你必须小心,例如,当两个物体相互保持强时。 dealloc 也在 ARC 中调用,因此您可以在释放对象的那一刻注销。

最新更新