あなたのメソッドは配列をautoreleaseに設定し、呼び出し元は返された配列を保持する必要があります。したがって、メソッドはもはや配列の責任を負いません。
アレイ内のオブジェクトはNSMutableArrayによって保持されるため、漏れないように自動解放に設定する必要があります。あなたはそれを行うために合理的なことですが戻る前autorelease
に配列を設定
- (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'd NSArrayを返すかどうかの選択は通常、あなたのメソッドの名前に依存します。メソッドの名前に 'alloc'、' init'、 'copy'という言葉を使った場合、Appleの規約に従い、呼び出し側はオブジェクトを所有していることを期待し、解放する責任があるので、自動解放しないでください。メソッド名にこれらのキーワードが含まれていない場合、 'autorelease'はうまくいきます。 –