我的应用程序遇到内存问题,

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

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

我有一个自定义的导航控制器:MyNavController,该控制器是我的根控制器,并推送主要的UIViewController:MyMainController,当应用启动时,应用使用约130 MB的内存,当我推送一个新控制器时:内存高达160然后我弹出该控制器:内存仍然为160(精确为159),然后我推另一个视图控制器:内存增加到190 MB ...内存永不减少。

  • 您可以确认一下这是一个保留周期吗?
  • 如果我在弹出视图控制器时没看错,那么内存应该减小视图控制器的内存大小吗?
  • 我总是对属性(按钮,视图,customView,customObject ...)使用强函数,但是当我在dealloc方法的第二级控制器中设置断点时,我知道它会被调用,因此应该释放该控制器吗?
  • 我已经尝试了一些方法:我做了一个空的UIViewController并将我的xib中的视图设置为我未发布的控制器之一,因此它可能比清除的还要重,因此该控制器没有任何代码行,只是.h和.m没有任何自定义代码,当我按下该控制器时,内存将增加,当我弹出它时,内存不会减少!我真的不明白我要寻找什么,我是否必须在MainViewController上找到要求?还是在控制器中压入堆栈?

  • 我只是使用以下命令加载控制器:
    GeoControllerViewController *aGeoController = [[GeoControllerViewController alloc] initWithNibName:@"GeoControllerViewController" bundle:nil];
    aGeoController.dictionnaryModele = _dicCours;
    [self.navigationController pushViewController:aGeoController animated:YES];
    

    提前致谢。

    最佳答案

    你问:

    您能确认一下这是一个保留周期吗?

    否。可能是泄漏。可能正在缓存。可能是一个保留周期。从您与我们分享的内容中我们无法分辨。

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

    通常,当您弹出时,它应该减少,但是如果对任何内容使用高速缓存,或者如果填充共享模型或您拥有的内容,则在初始推送之前,它可能不会完全返回到内存级别。话虽如此,如果有缓存在运行,如果您多次按下和弹出,那么在您多次按下和弹出之后,分配中看到的总“ Activity 字节”应该恢复到一致的水平。

    我总是在我的属性(按钮,视图,customView,customObject ...)中使用strong,但是当我在dealloc方法的第二级控制器中设置断点时,我知道它会被调用,因此应该释放控制器吗?

    如果该控制器的dealloc被调用,则表明您不参与任何保留周期,并且与该控制器关联的内存将由系统恢复。从理论上讲,任何其强大的性能也应释放。
    顺便说一句,通常您的IBOutlet引用(即由NIB / storyboard创建的那些东西)在ARC项目中应该是weak

    一些具体的建议:

  • 通过静态分析器(Xcode“产品”菜单上的“分析”)运行代码,并确保那里的警告为零。如果有,请先修复它们。
  • 通过Instruments中的Leaks工具运行代码,并查看其是否报告任何内容。如果是这样,它将告诉您如何继续。
  • 如果仍然找不到问题,请使用Instruments中的“分配”工具运行该工具,在转到下一个场景之前标记一个堆快照/世代,转到下一个场景,返回并标记另一个堆快照/世代。然后,您可以分析这两个时刻之间已分配但未释放的内容,这将告诉您接下来要查找的内容。
    有关如何执行此操作的一些演示,请参阅WWDC 2012视频iOS App Performance: Memory
  • 关于iphone - ARC假人保留周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19420369/

    10-12 14:41