我正在研究iOS中可能存在的内存泄漏陷阱,并且我不断遇到强大的参考周期。这已经变得清晰了,即使在Apple's documentation中,我也能找到关于内存泄漏的唯一内容。
要避免内存泄漏的其他原因是什么?
答案 0 :(得分:6)
在Objective-C中,有许多类型的泄漏,静态分析器( shift - 命令 - B )可以帮助识别。除了简单的强参考周期之外,如果您没有将ARC与Objective-C一起使用,那么它很容易泄漏。如果您正在使用Core Foundation对象(特别是在Objective-C中)并且不小心,则很容易泄漏。静态分析器非常擅长识别这些简单问题。
但稍微退一步,Apple讨论了三种常见的内存问题:
泄露内存:无法再次访问的内存。
这样做的例子就是Core Foundation类型的错误桥接,强大的参考周期等。
放弃内存:不会再次访问的内存。
这方面的一个例子是视图控制器中的循环引用(从A到B再到A再次,而不是弹出/解除回A)。原始的A视图控制器仍然存在,理论上可以访问它的对象,但你永远不会这样做,因为你现在正在使用A的新实例。
缓存内存:可以再次访问的内存(但您可能会或可能不会再次访问它)。
这方面的一个示例是imageNamed
与UIImage
一起使用,无论你是否真的这样做,它都会在将来再次需要时缓存图像。
在这些情况下,正确的缓存机制将响应内存压力并清除缓存。但如果不这样做会导致记忆无限增长。
我建议观看一些WWDC视频,包括:
答案 1 :(得分:3)
有四种一般情况:
如果您正在使用Swift,则会全面为您完成内存管理,而您可能导致泄漏的唯一可能方式是保留周期。< / p>
这可能比您想象的更容易发生。实际上,在我自己的现实生活中,最难的情况是那些正常使用Cocoa创建保留周期而你却没有意识到的情况。示例是使用观察者对象注册NSNotificationCenter,以及WebKit的WKUserContentController(我在讨论here时)。
如果您使用带有ARC的Objective-C,则另一个问题是您可能会错误管理CFTypeRefs。释放它们取决于您,您可以忘记/不能这样做。 (如果您使用Swift,则不会出现此问题,因为Swift会为您管理CFTypeRefs。)
如果您使用没有ARC的Objective-C(这对您来说非常愚蠢),您可能会错误管理任何对象,因此您创建的任何内容都可能泄漏。
最后,Cocoa本身有时会以较小的方式泄漏次要物体,但通常没有什么可以做的,如果它发生的话,这不是你的错。
答案 2 :(得分:2)
如果您不使用ARC,则很容易导致内存泄漏。如果你分配/初始化一个对象,然后不释放它,或者有更多的保留而不是发布,然后忘记它,那么对象就会泄露。
ARC没有内存管理使用malloc / calloc分配的内存。这完全取决于你。如果你使用一块内存,你必须在完成它时释放它,否则它会被泄露。
除非你使用正确的桥接转换来将这些对象控制到Cocoa,否则ARC也不会对内核管理Core Foundation Objects。因此,如果你CFCreate一个Core Foundation对象然后不CFRelease它,你也只是泄漏了内存。