比较以下2个片段:
样本1:
[[UIApplication shareApplication] openURL: [NSURL URLWithString:@"http://stackoverflow.com"]]
和样本2:
NSURL *url = [[NSUrl URLWithString:@"http://stackoverflow.com"];
[[UIApplication shareApplication] openURL: url];
[url release];
样本1会导致内存泄漏吗? 样本2中的[url release]是多余的?
如果确实发生了内存泄漏,那有多糟糕?
答案 0 :(得分:9)
示例1不会导致内存泄漏,并且是执行此操作的一般方法。 NSURL
对象是自动释放的,因此您不应该自己释放它(就像在示例2中那样)。
答案 1 :(得分:2)
样品1非常精细,如上所述。但是,样本2实际上应该导致崩溃。 -URLWithString:
是自动释放的,因此当下一个自动释放池耗尽时,其保留计数实际上已经为零。像你正在做的那样明确地释放它会立即将其保留计数设为0,从而导致释放。然后,当自动释放池耗尽时,它将再次尝试释放该字符串,从而导致崩溃。
最好在Xcode中使用Build and Analyze命令。它可以接收并警告你几乎所有的内存泄漏问题,虽然它并不完美。不过,这是一个很好的做法。
答案 2 :(得分:-2)
@BoltClock,我认为在样本1中对象是自动释放的并不完全正确。
在示例2中,名为url
的变量被赋予从[NSUrl URLWithString:]
方法返回的对象,从而将其保留计数增加1.为了平衡它,我们需要release
它。在样本1中,对象的引用直接传递给接收者,我们没有什么可担心它的保留计数,因此没有释放。
请注意,我们不是自动释放,因为我们首先没有保留任何内容。 “代码中没有自动释放的变量!”
如果我在某个地方出现概念错误,请纠正我。只是为了完成这一点,任何一个样本都没有泄漏,两者都是正确的方法。