2009-06-13 89 views
4

这是我写的一些代码的要点。我担心我没有正确解决NSMutableArray上数组类方法的保留/释放问题。以下内容是否真的在泄漏内存?可可触摸问题。应该保留[NSMutableArray数组]吗?

for(a while) { 
    // do stuff 
    NSMutableArray *a = nil; 
    // do stuff 
    if (!a) { 
     a = [NSMutableArray array]; 
    } 
} // for(a while) 

回答

12

你不会泄露这个代码的内存,并释放自己的数组中会导致崩溃时,阵列在运行循环结束时自动释放。

大多数可可类提供了几个制作一个新的对象的方式,并与本公约非常一致:

  1. [[NSSomeObject alloc] init]:你是负责释放对象(实例方法)。

  2. [NSSomeObject someObject]:对象将自动释放给你,通常在运行循环的末尾(类方法)。这大致相当于[[[NSSomeObject alloc] init] autorelease]

正确使用的实例方法是:

a = [[NSMutableArray alloc] init]; 
// do stuff 
[a release]; 

正确使用类方法是:

a = [NSMutableArray array]; 
// do stuff, array is in the autorelease pool 

注意,苹果建议你远离尽可能方便的方法来提高性能。这是controversial advice,可能不会节省太多的处理器时间,并且将alloc-init从发布版本中分离出来,您可能实际上并不太关心保留的对象。

+0

优秀的答案。非常感谢。 – dugla 2009-06-13 17:17:16

6

Cocoa Memory Managment Rules

如果使用名称以“黄金”或“新”,或包含“复制”(例如一个方法来创建它你需要一个对象的所有权, alloc,newObject或mutableCopy),或者如果您发送一个保留消息。您有责任放弃使用发行版或自动发行版所拥有的对象的所有权。任何其他时间你收到一个对象,你不能释放它。

因此与线:

a = [NSMutableArray array]; 

你不采取数组的所有权,它会被传递给你自动释放。内存将由autorelease池自动处理,一旦它不再被使用,它会为你释放。但是,如果要将数组保留在当前事件之外,则必须保留该数组,否则它将为您释放。

2

是的,如果你想要它坚持下去。

返回的对象是一个autoreleased对象,当它的autorelease池被清除时它将被释放。

所有以“array”开头的数组类方法返回这些类型的自动释放对象。

阅读本doc苹果

0

这是有效的。当你有问题时,手动管理可能有助于学习。

有一个约定:

  • 初始化前缀(INIT,initWithString :)表示为1的保留计数,其中
  • 对象名的前缀(字符串,stringWithString :)表示一个自动释放物体

多年来,我一直习惯于在通话网站发布我所能做的事情,而不是将其推向自动发布。一些autorelease问题,然后变得很难追查。当然,在这种情况下,autorelease对程序员来说是一种方便(没有任何错误),但是会对重用,清晰度和性能产生负面影响(在大型代码库/程序中更是如此)。