【问题标题】:Does this objective-c code cause memory leak?这个objective-c代码会导致内存泄漏吗?
【发布时间】:2011-02-05 17:06:46
【问题描述】:

比较以下 2 个 sn-ps:

样本 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] 是否多余?

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

【问题讨论】:

    标签: objective-c ios memory-management


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      样本 1 非常好,正如上面已经描述的那样。但是,示例 2 实际上应该会导致崩溃。 -URLWithString: 是自动释放的,因此当下一个自动释放池耗尽时,它的保留计数实际上已经为零。像您正在做的那样显式释放它会立即将其保留计数变为 0,从而导致释放。然后,当自动释放池耗尽时,它会再次尝试释放该字符串,从而导致崩溃。

      最好在 Xcode 中使用构建和分析命令。它可以接收并警告您几乎所有的内存泄漏问题,尽管它并不完美。不过,这是一个很好的做法。

      【讨论】:

        【解决方案3】:

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

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

        请注意,我们不是自动发布的,因为我们一开始就没有保留任何东西。 “自动释放的代码中没有变量!”

        如果我在某处概念上有错误,请纠正我。为了完成这一点,任何一个样本都没有泄漏,而且都是正确的做法。

        【讨论】:

        • 很抱歉,这是错误的。除非您使用以“alloc”或“new”开头的方法或包含“copy”的方法创建对象,否则不应释放对象。 URLWithString:返回一个自动释放的 NSURL,它将在 runloop 结束时自动释放。 Memory Management Programming Guide
        • 同意第一部分。如果 URLWithString 返回一个自动释放的对象,那么示例 2 中的 [url release] 是多余的,对吧?
        • 你错了。该对象由 NSURL 类自动释放。当您调用 +(NSURL *)URLWithString:(NSString *)string 时,NSURL 类 allocs-init 会创建一个新实例,然后自动释放并将其返回给您。如果您不保留它,则无法保证它不会在应用程序生命周期内发布(它可能会在下一个运行循环期间发布)。如果 NSURL 没有释放实例,您将产生泄漏,因为按照惯例,只有当其“构造函数”方法以“init”或“copy”开头时,您才是对象所有者。
        • 哦,对不起。现在我读了它,它是有道理的,上一篇文章。我误解了 BoltClock 的帖子。他是对的。
        • 永远不会影响保留计数,除非您这样做retaincopy 甚至不会增加同一对象的保留计数,它会创建一个全新的对象反而)。第二种方式不正确;如果你 release 一个自动释放的对象,你会崩溃,因为你没有为自己保留它。
        猜你喜欢
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2015-01-24
        • 1970-01-01
        相关资源
        最近更新 更多