ARC保留假人的循环

时间:2013-10-17 07:10:06

标签: iphone ios memory-management automatic-ref-counting block

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

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

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

我有一个自定义导航控制器:MyNavController,此控制器是我的根控制器,并推送主UIViewControllerMyMainController,当应用启动应用时,使用大约130 MB的内存,当我推一个新的控制器:内存上升到160然后我弹出这个控制器:内存仍然是160(确切地说是159)然后我推另一个视图控制器:内存上升到190 MB ...内存从不下跌降落。

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

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

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

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

我只是使用以下方式加载我的控制器:

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

你问:

  

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

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

  

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

通常情况下,当您弹出时会减少,但如果使用缓存进行任何操作,或者填充共享模型或有什么内容,则可能不会在初始推送之前完全返回到内存级别。话虽如此,如果有游戏中的缓存,如果你多次推送和弹出,你在分配中看到的总“活字节”应该在你推或弹几次后返回到一致的水平。

  

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

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

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


一些具体的建议:

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

  2. 通过Instruments中的Leaks工具运行您的代码,看看它是否报告任何内容。如果是,那将告诉您如何继续。

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

    有关如何执行此操作的演示,请参阅WWDC 2012视频iOS App Performance: Memory

答案 1 :(得分:0)

坦率地说,130MB对于一般的开始来说似乎非常过分。

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

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

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