繁体   English   中英

ARC保留假人的循环

[英]ARC Retain cycle for dummies

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

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

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

我有一个自定义导航控制器: MyNavController ,这个Controller是我的根控制器,并推送主UIViewControllerMyMainController ,当应用程序启动应用程序使用大约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的。


一些具体的建议:

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

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

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

    有关如何执行此操作的一些演示,请参阅WWDC 2012视频iOS应用程序性能:内存

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM