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

Ade*_*ino 57 iphone memory-leaks objective-c ipad ios

可以有人告诉我声明一个可变数组的区别:

NSMutableArray *array = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)

NSMutableArray *array = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Bol*_*ock 38

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


mat*_*att 33

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

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

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

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

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