[NSMutableArray数组]与[[NSMutableArray alloc] init]之间的区别

时间:2011-03-24 17:38:32

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

有人能告诉我用以下方法声明一个可变数组的区别:

NSMutableArray *array = [NSMutableArray array];

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

因为在开始时我用alloc来声明我的所有数组,如果在某个函数的最后我返回了使用alloc创建的数组,我必须自动释放该数组,因为内存泄漏问题。

现在使用第一个声明我不需要发布任何内容。

由于

2 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:31)

  

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

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

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

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

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