1

我的应用程序存在内存问题,

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

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

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

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

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

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

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

我只需使用以下命令加载我的控制器:

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

提前致谢。

4

2 回答 2

4

你问:

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

不,可能是泄漏。可能是缓存。可能是一个保留周期。我们无法判断您与我们分享的内容。

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

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

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

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

顺便说一句,通常您的IBOutlet参考资料(即由 NIB/故事板创建的那些东西)应该weak在 ARC 项目中。


一些具体的建议:

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

  2. 通过 Instruments 中的 Leaks 工具运行您的代码,看看它是否报告了什么。如果是这样,那将告诉您如何进行。

  3. 如果仍然找不到问题,请使用 Instruments 中的 Allocations 工具运行该工具,在进入下一个场景之前标记一个 heapshot/generation,进入下一个场景,返回并标记另一个 heapshot/generation。然后,您可以及时分析在这两个时刻之间分配和未释放的内容,这将告诉您接下来要查找的内容。

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

于 2013-10-17T07:36:07.737 回答
0

坦率地说,一般来说,130MB 似乎太过分了。

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

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

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

于 2013-10-17T07:22:35.763 回答