2011-07-10 38 views
2

我有一个方法需要返回一个对象数组。事情是这样做,现在是:在Objective-C中返回一个NSArray对象的正确方法是什么?

  1. 创建NSMutableArray*
  2. 每一个对象,以下一些计算,是alloc -d和init -ed
  3. 每个对象,初始化后,被加入到与阵列addObject
  4. 数组返回

是自动释放数组做正确的事?数组内的对象怎么样?这些应该什么时候发布?

回答

3

是的,在返回之前将数组设置为autorelease是合理的做法。此外,如果您要将数组放入数组中,请致电allocinit,然后将其添加到数组后,您应该在每个数组上调用release(或autorelease)。只要数组在阵列中,对象仍将保留。从阵列中删除它们(或释放阵列)将导致它们被释放。

+0

要添加到这个正确答案,是否返回'autorelease'd'NSArray'的选择通常取决于您的方法的名称。如果在方法名中使用'alloc','init'或'copy'这两个字,那么遵循Apple惯例,那么您不应该自动释放,因为调用者现在期望他们拥有该对象并负责释放它。如果你的方法名不包含这些关键字,那么'autorelease'ing很好。 –

3

你的方法应该将数组设置为autorelease,然后调用者应该保留返回的数组。所以方法不再对数组负责,调用者是。

数组中的对象将被NSMutableArray保留,所以您应该将它们设置为自动释放,以便它们不泄漏。

- (NSMutableArray*) calleeMethod 
{ 
    // this method is retaining the array temporarily 
    // someone else is responsible for retaining it 
    NSMutableArray * newArray = [[[NSMutableArray alloc] init] autorelease]; 

    // add some objects 
    for (int i = 0; i < 10; i++) 
    { 
     // autorelease these objects because newArray will retain each item and 
     // is responsible for the items 
     FooObject * newFooObject = [[[FooObject alloc] initWithNumber:i] autorelease]; 
     [newArray addObject:newFooObject]; 
    } 

    return newArray; 
} 

- (void) callerMethod 
{ 
    // retain the returned array, because we own it 
    mNewArray = [[self calleeMethod] retain]; 

    // do stuff 

    // make sure you explicitly release mNewArray later (probably in the dealloc) 
} 
+0

您不需要将数组中的对象设置为'autorelease'。包含的数组将在添加时“保留”它们,并在删除时释放它们。只需在将它们添加到阵列后自行释放它们。 – highlycaffeinated

+0

@highlycaffeinated如果你分配它们,你将需要明确地释放它们或自动释放它们。 – RedBlueThing

+3

同意。我的(做得不好)的一点是,如果你只是将它们添加到数组中,将它们添加到自动释放池的价值不大。 – highlycaffeinated

相关问题