【发布时间】:2012-02-15 14:00:52
【问题描述】:
我是 iOS 5 和 ARC 的新手,请原谅我的愚蠢问题。
如果我们在项目中使用 ARC,是否意味着根本不会有任何内存泄漏。
如果我们使用 ARC,是否需要使用 Instruments 来检测内存泄漏和 NSZombies?
【问题讨论】:
标签: iphone objective-c ios ios5 automatic-ref-counting
我是 iOS 5 和 ARC 的新手,请原谅我的愚蠢问题。
如果我们在项目中使用 ARC,是否意味着根本不会有任何内存泄漏。
如果我们使用 ARC,是否需要使用 Instruments 来检测内存泄漏和 NSZombies?
【问题讨论】:
标签: iphone objective-c ios ios5 automatic-ref-counting
ARC 将帮助您消除某些类型的泄漏,因为您不会忘记 release 或 autorelease 单个对象。例如,这种类型的错误变得不可能:
myLabel.text = [[NSString alloc] initWithFormat:@"%d", 17];
// oops, just leaked that NSString!
但是,ARC 不会消除由保留周期引起的泄漏。您仍然可以通过使用弱引用或在循环泄漏之前手动中断循环来消除保留循环。例如,随着我们开始更多地使用块,块/自保留循环变得更加普遍。 Transitioning to ARC Release Notes 讨论了如何使用弱引用来避免这些循环。
【讨论】:
不,这并不能防止发生内存泄漏。在引用计数的运行时中发生的情况是,有时您的代码会留下悬空引用,然后对象不会被释放。编写好代码仍然取决于您。
【讨论】:
如果我们在项目中使用 ARC,是否意味着根本不会有任何内存泄漏。
可能仍然存在泄漏——在您的程序和您使用的库中。同样,ARC 仅适用于 ObjC 对象 - 您可以轻松泄漏任何不是 objc 对象的堆分配(例如malloc/new)。
如果我们使用 ARC,是否需要使用 Instruments 来检测内存泄漏和 NSZombies?
是的。之前的回复应该详细说明为什么您的程序不能保证没有这些问题。此外,如果您做一些愚蠢的事情,编译器可能会出错,如果没有正确保护您的数据(例如并发执行),您肯定会导致问题。
【讨论】: