2011-07-10 9 views
2

私はオブジェクトの配列を返す必要があるメソッドがあります。道それが今であることを行います、Objective-CでオブジェクトのNSArrayを返す正しい方法は何ですか?

  1. は、いくつかの計算以下、NSMutableArray*
  2. 各オブジェクトを作成しalloc -dとinit
  3. 各オブジェクトを-ed、初期化後の配列に追加されていますaddObject
  4. 配列は

を返された配列に行うには正しいことを自動解放していますか?配列内のオブジェクトはどうですか?これらはいつリリースされるべきですか?

答えて

3

はい、。また、配列に入れたものにallocinitを呼び出す場合は、アレイに追加した後にそれぞれ(autorelease)を呼び出す必要があります。オブジェクトは配列内にある限り、保持されます。それらをアレイから削除する(またはアレイを解放する)と、それらは解放されます。

+0

この正しい答えに追加するには、 'autorelease'd NSArrayを返すかどうかの選択は通常、あなたのメソッドの名前に依存します。メソッドの名前に 'alloc'、' init'、 'copy'という言葉を使った場合、Appleの規約に従い、呼び出し側はオブジェクトを所有していることを期待し、解放する責任があるので、自動解放しないでください。メソッド名にこれらのキーワードが含まれていない場合、 'autorelease'はうまくいきます。 –

3

あなたのメソッドは配列を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) 
} 
+0

アレイ内のオブジェクトを 'autorelease'に設定する必要はありません。格納されている配列は、追加時にそれらを保持し、それらが削除されたときにそれらを解放します。彼らが配列に追加された後に、あなた自身が '解放 'します。 – highlycaffeinated

+0

@ highlycaffeinatedもしあなたがそれらを割り当てるなら、あなたは明示的にそれらをリリースするか、またはそれらを自動リリースする必要があります。 – RedBlueThing

+3

合意。私の(間違って作られた)点は、あなたがやっていることがすべてそれらをアレイに加えることであれば、オートリリースプールにそれらを追加することはほとんど価値がないということでした。 – highlycaffeinated

関連する問題