【问题标题】:Difference between [NSMutableArray array] vs [[NSMutableArray alloc] init][NSMutableArray array] 与 [[NSMutableArray alloc] init] 之间的区别
【发布时间】:2011-07-22 08:19:44
【问题描述】:

谁能告诉我声明一个可变数组的区别:

NSMutableArray *array = [NSMutableArray array];

NSMutableArray *array = [[NSMutableArray alloc] init];

因为一开始我使用 alloc 声明了所有数组,如果在某个函数结束时返回了使用 alloc 创建的数组,由于内存泄漏问题,我不得不自动释放该数组。

现在使用第一个声明我不需要释放任何东西。

谢谢

【问题讨论】:

    标签: iphone objective-c ios ipad memory-leaks


    【解决方案1】:

    因为一开始我使用 alloc 声明我的所有数组,如果在某个函数结束时我返回了使用 alloc 创建的数组,我必须自动释放该数组,因为内存泄漏问题。现在使用第一个声明我不需要释放任何东西

    当您“出售”一个对象时,这是完全正确的。但在其他情况下,当您在 iOS 上创建对象时,您可以在获取现成的自动释放对象和调用 alloc 然后释放之间进行选择,Apple 希望您使用 alloc 和 release,因为这样可以保持对象的生命周期简短且在您的控制之下。

    这里的问题是,自动释放的对象存在于自动释放池中,并且可以堆积起来,直到池耗尽,无论何时。

    另外需要注意的是循环。您可能会在不知情的情况下生成自动释放的对象,它们只是堆积在池中。解决方案是在循环开始时创建自己的自动释放池,并在循环结束时释放它,这样每次循环都会释放对象。

    EDIT - 12/18/2011: 但是随着 iOS 5 和 ARC 的到来,自动释放机制效率更高,并且没有 release 这样的东西,所以区别在 alloc-init 和出售自动释放对象的便利构造函数之间变得没有实际意义。 (而且它现在是一个@autoreleasepool 块,而不是一个自动释放池(伪)对象。)

    【讨论】:

    • 我应该补充一点,我刚刚写了一本关于 iOS 编程的书,如果你刚刚开始学习,内存管理一章可能对你有用。它解释了您在此处询问的详细信息:apeth.com/iOSBook/ch12.html
    • 术语“vend”在 Cocoa 中通常用于表示“通过 PDO 提供”。什么意思?
    • 我相信这里的“vend”是指返回一个要在其他地方使用的对象——他说返回一个自动释放的对象是正确的,而不是当一个仅在他们自己的方法中使用对象,在这种情况下,他建议使用 alloc/init。
    • 仅供参考,另一条评论中提到的PDOPortable Distributed Objects,用于通过网络调用对象。 en.wikipedia.org/wiki/Portable_Distributed_Objects
    【解决方案2】:

    array 类方法本身会产生一个自动释放的数组,这意味着您不必(也不应该)手动释放它。

    【讨论】:

    • 那么用第一种方法就可以了?
    • @Adelino:是的,只要你不向它发送发布消息。
    • 我需要在 ARC 中使用它吗?
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2013-07-12
    • 2014-03-09
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多