我有一个方法需要返回一个对象数组。事情是这样做,现在是:在Objective-C中返回一个NSArray对象的正确方法是什么?
- 创建
NSMutableArray*
- 每一个对象,以下一些计算,是
alloc
-d和init
-ed - 每个对象,初始化后,被加入到与阵列
addObject
- 数组返回
是自动释放数组做正确的事?数组内的对象怎么样?这些应该什么时候发布?
我有一个方法需要返回一个对象数组。事情是这样做,现在是:在Objective-C中返回一个NSArray对象的正确方法是什么?
NSMutableArray*
alloc
-d和init
-edaddObject
是自动释放数组做正确的事?数组内的对象怎么样?这些应该什么时候发布?
是的,在返回之前将数组设置为autorelease
是合理的做法。此外,如果您要将数组放入数组中,请致电alloc
和init
,然后将其添加到数组后,您应该在每个数组上调用release
(或autorelease
)。只要数组在阵列中,对象仍将保留。从阵列中删除它们(或释放阵列)将导致它们被释放。
你的方法应该将数组设置为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)
}
您不需要将数组中的对象设置为'autorelease'。包含的数组将在添加时“保留”它们,并在删除时释放它们。只需在将它们添加到阵列后自行释放它们。 – highlycaffeinated
@highlycaffeinated如果你分配它们,你将需要明确地释放它们或自动释放它们。 – RedBlueThing
同意。我的(做得不好)的一点是,如果你只是将它们添加到数组中,将它们添加到自动释放池的价值不大。 – highlycaffeinated
要添加到这个正确答案,是否返回'autorelease'd'NSArray'的选择通常取决于您的方法的名称。如果在方法名中使用'alloc','init'或'copy'这两个字,那么遵循Apple惯例,那么您不应该自动释放,因为调用者现在期望他们拥有该对象并负责释放它。如果你的方法名不包含这些关键字,那么'autorelease'ing很好。 –