iOS:警惕伪"循环引用"造成内存资源释放的问题。

前不久发现App运行时内存占用一直在增大,嗅到一种不好的味道…闻起来像内存泄露啊!

在Xcode中打开调试内存图(Debug Memory Graph),奇怪的是并没有发现任何对象有引用循环!

看来初步判断并不是”死循环”导致的”内存泄露”。严格来说,如果没有引用循环就不存在内存泄露,因为你对内存的使用完全是按照内存管理器的规则来做的,怎么会有错呢?

所以这应该是对象生命周期意外过长的问题!

什么意思!?

通俗的说:这是对象存活的时间比预计的要长的情况!我们以为它已经被释放了,但实际并没有!

为什么会造成这种情况呢?一种原因是该对象被其他长寿命的对象所引用了,只要父对象不挂,它们也不会挂!

所以只要找到父对象,然后解引用,这些子对象就会被释放,问题就迎刃而解了。

最后一个实际的问题是:怎么找到这些对象的引用对象呢?

所幸的是,Xcode的调试对象图工具为我们提供了一个很好地观察窗口,我们要做的是:

1.找到那些不应该还存活的对象

2.查看这些对象的内存细节拓扑图,顺着分配(alloc)线向上寻找到它们的引用对象

3.知道了引用对象,你就十有八九就知道是哪里出了问题,从而解引用它们!

对于一个上线的App来说,任何原因的内存占用过大都不是好兆头,这会增大其被系统kill的机率!希望大家把这种苗头GG在自己手里而不是让用户来发现 ;)

可能这篇博文说的比较抽象,如果有什么疑问,可以问我。

感谢观赏 ;)

猜你喜欢

转载自blog.csdn.net/mydo/article/details/81535574