我的应用程序面临内存问题,
我有一个基于导航的应用程序,如果我按下,弹出并推送我的所有控制器,应用程序将因内存过载而关闭。
我认为这就是我们所说的保留周期:
我有一个自定义导航控制器:MyNavController
,此控制器是我的根控制器,并推送主UIViewController
:MyMainController
,当应用启动应用时,使用大约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];
提前致谢。
答案 0 :(得分:4)
你问:
你能确认我是一个保留周期吗?
没有。可能是泄漏。可以缓存。可能是一个保留周期。我们无法判断您与我们分享的内容。
如果我弹出一个视图控制器时没错,那么内存应该减少视图控制器的内存大小?
通常情况下,当您弹出时会减少,但如果使用缓存进行任何操作,或者填充共享模型或有什么内容,则可能不会在初始推送之前完全返回到内存级别。话虽如此,如果有游戏中的缓存,如果你多次推送和弹出,你在分配中看到的总“活字节”应该在你推或弹几次后返回到一致的水平。
我总是在我的属性中使用strong(按钮,视图,customView,customObject ...)但是当我在第二级控制器中将断点设置为dealloc方法时,我知道它被调用,所以应该释放控制器?
如果调用该控制器的dealloc
,则告诉您这不涉及任何保留周期,并且系统将恢复与控制器关联的内存。从理论上讲,任何强大的属性也应该被释放。
顺便说一句,通常你的IBOutlet
引用(即由NIB /故事板创建的那些内容)应该是ARC项目中的weak
。
一些具体的建议:
通过静态分析器运行代码(Xcode“产品”菜单上的“分析”)并确保那里没有警告。如果您有,请先修复它们。
通过Instruments中的Leaks工具运行您的代码,看看它是否报告任何内容。如果是,那将告诉您如何继续。
如果仍然找不到问题,请使用“仪器”中的“分配”工具运行该工具,在转到下一个场景之前标记快照/生成,转到下一个场景,返回并标记另一个场景heapshot /生成。然后,您可以分析在这两个时刻之间分配和未分配的内容,这将告诉您接下来要查找的内容。
有关如何执行此操作的演示,请参阅WWDC 2012视频iOS App Performance: Memory。
答案 1 :(得分:0)
坦率地说,130MB对于一般的开始来说似乎非常过分。
我不会那么肯定。问题是:除了导航控制器之外,你是否对控制器有任何引用? 它也可能是泄漏。为什么这些控制器消耗这么多内存?
是的,内存消耗应该更低。
我不知道我的问题是否正确。通常强大的属性是可以的,但你必须要小心,例如当两个物体相互坚强时。在ARC中也会调用dealloc
,因此您可以注销释放对象的时刻。