[英]ARC Retain cycle for dummies
我的应用程序面临内存问题,
我有一个基于导航的应用程序,如果我推,弹出并推动我的所有控制器,应用程序将因内存过载而关闭。
我认为这就是我们所说的保留周期:
我有一个自定义导航控制器: MyNavController
,这个Controller是我的根控制器,并推送主UIViewController
: MyMainController
,当应用程序启动应用程序使用大约130 MB的内存,当我推一个新的控制器:内存上升到160然后我弹出这个控制器:内存仍然是160(确切地说是159)然后我推另一个视图控制器:内存高达190 MB ......内存永远不会下降。
你能证实我这是一个保留周期吗?
如果我没有错,当我弹出一个视图控制器时,内存应该减少视图控制器的内存大小?
我总是在我的属性(按钮,视图,customView,customObject ...)中使用strong,但是当我在第二级控制器中设置断点到dealloc方法时,我知道它被调用了,所以应该释放控制器吗?
我尝试了一些东西:我做了一个空的UIViewController
并将我的xib中的视图设置为我的一个非释放控制器,因此它可能比清除更重,所以这个控制器没有代码行,只需一个.h和.m没有任何自定义代码,当我按下这个控制器时内存上升,当我弹出它时,内存不会下降! 我真的不明白我需要寻找什么,我是否必须在我的MainViewController
上进行llok? 或者在控制器中我推动堆栈?
我只需加载我的控制器:
GeoControllerViewController *aGeoController = [[GeoControllerViewController alloc] initWithNibName:@"GeoControllerViewController" bundle:nil];
aGeoController.dictionnaryModele = _dicCours;
[self.navigationController pushViewController:aGeoController animated:YES];
提前致谢。
你问:
你能证实我这是一个保留周期吗?
不,可能是泄漏。 可以缓存。 可能是一个保留周期。 我们无法判断您与我们分享的内容。
如果我没有错,当我弹出一个视图控制器时,内存应该减少视图控制器的内存大小?
通常它会在您弹出时减少,但如果使用缓存进行任何操作,或者填充共享模型或者您拥有的内容,它可能不会在初始推送之前完全返回到内存级别。 话虽如此,如果有游戏中有缓存,如果你多次推送和弹出,你在分配中看到的总“活字节”应该在你推送和弹出几次后返回到一致的水平。
我总是在我的属性(按钮,视图,customView,customObject ...)中使用strong,但是当我在第二级控制器中设置断点到dealloc方法时,我知道它被调用了,所以应该释放控制器吗?
如果调用该控制器的dealloc
,则会告诉您这不涉及任何保留周期,并且系统将恢复与控制器关联的内存。 从理论上讲,它的任何强大属性也应该被释放。
IBOutlet
,通常你的IBOutlet
引用(即由NIB /故事板创建的那些东西)在ARC项目中应该是weak
的。
一些具体的建议:
通过静态分析器运行代码(Xcode“产品”菜单上的“分析”)并确保在那里没有警告。 如果您有,请先修复它们。
通过Instruments中的Leaks工具运行代码,看看它是否报告任何内容。 如果是,那将告诉您如何继续。
如果仍然找不到问题,请使用“仪器”中的“分配”工具运行该工具,在转到下一个场景之前标记快照/生成,转到下一个场景,返回并标记另一个快照/生成。 然后,您可以分析在这两个时刻之间分配和未分配的内容,这将告诉您接下来要查找的内容。
有关如何执行此操作的一些演示,请参阅WWDC 2012视频iOS应用程序性能:内存 。
坦率地说,130MB似乎对于一般的开始来说太过分了。
我不会那么肯定。 问题是:除了导航控制器之外,你是否对控制器有任何引用? 它也可能是泄漏。 为什么这些控制器消耗这么多内存?
是的,内存消耗应该更低。
我不知道我的问题是否正确。 通常强大的属性是可以的,但你必须要小心,例如当两个物体相互坚持时。 在ARC中也调用dealloc
,因此您可以在释放对象时注销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.