这个objective-c代码会导致内存泄漏吗?

时间:2011-02-05 17:06:46

标签: objective-c ios memory-management

比较以下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]是多余的?

如果确实发生了内存泄漏,那有多糟糕?

3 个答案:

答案 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中,对象的引用直接传递给接收者,我们没有什么可担心它的保留计数,因此没有释放。

请注意,我们不是自动释放,因为我们首先没有保留任何内容。 “代码中没有自动释放的变量!”

如果我在某个地方出现概念错误,请纠正我。只是为了完成这一点,任何一个样本都没有泄漏,两者都是正确的方法。