[英]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.