我的应用程序遇到内存问题,
我有一个基于导航的应用程序,如果我推送,弹出并推送所有控制器,则该应用程序将由于内存过载而关闭。
我认为这就是我们所说的保留周期:
我有一个自定义的导航控制器:MyNavController
,该控制器是我的根控制器,并推送主要的UIViewController
:MyMainController
,当应用启动时,应用使用约130 MB的内存,当我推送一个新控制器时:内存高达160然后我弹出该控制器:内存仍然为160(精确为159),然后我推另一个视图控制器:内存增加到190 MB ...内存永不减少。
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
。
一些具体的建议:
有关如何执行此操作的一些演示,请参阅WWDC 2012视频iOS App Performance: Memory。
关于iphone - ARC假人保留周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19420369/