繁体   English   中英

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

[英]Does this objective-c code cause memory leak?

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

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

示例1不会导致内存泄漏,并且是执行此操作的一般方法。 NSURL对象是自动释放的,因此您不应该自己释放它(正如您在示例2中所做的那样)。

如上所述,样品1非常精细。 但是,样本2实际上应该导致崩溃。 -URLWithString:是自动释放的,因此当下一个自动释放池耗尽时,其保留计数实际上已经为零。 像你正在做的那样明确地释放它会立即将其保留计数设为0,从而导致释放。 然后,当自动释放池耗尽时,它将再次尝试释放该字符串,从而导致崩溃。

最好在Xcode中使用Build and Analyze命令。 它可以接收并警告你几乎所有的内存泄漏问题,虽然它并不完美。 不过,这是一个很好的做法。

@BoltClock,我认为在样本1中对象是自动释放的并不完全正确。

在示例2中,名为url的变量被赋予从[NSUrl URLWithString:]方法返回的对象,从而将其保留计数增加1.为了平衡它,我们需要release它。 在样本1中,对对象的引用直接传递给接收者,我们没有什么可担心它的保留计数,因此没有释放。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM