2011-07-15 12 views
1

以下のコードを見ていてください:executeFetchRequest:resultのNSArrayを返すときは、保持するか、自動解放するか、何もしませんか?

- (NSArray *)requestEntities:(NSString *)entityName { 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
           entityForName:entityName inManagedObjectContext:_context]; 

    [fetchRequest setEntity:entity]; 

    NSError *requestError = nil; 

    NSArray *result = [_context executeFetchRequest:fetchRequest error:&requestError]; 

    [fetchRequest release], fetchRequest = nil; 

    return result; 
} 

を、私はどこか別の結果を使用する必要があり、この方法では、正しく(保持することなく、または自動解放)返された結果ですか?また、呼び出し元が結果を取得したり、保持したり、すぐに使用したりするときに、呼び出し元は何をすべきですか?

ありがとうございます!

答えて

1

new,alloc、またはcopyを含むメソッド以外のメソッドから返されるオブジェクトについては、あなたが責任を負わないということです。与えられた配列はほぼ確実に既にオートリリースされているので、コードが終了して実行ループに戻ります。そのポイントを超えて配列を保持する必要がある場合(たとえば、それらの結果を保持して将来のUIイベントに応答するために参照する場合)、配列を保持する必要があります。保持する必要があります。

memory management programming guideを完全に読むことをお勧めします。少なくとも、最初のいくつかのセクションは、あなたが尋ねていることの肉の権利を取得します。

+0

私が間違っている場合は、@ zemを修正してください。しかし、あなたのコードが終了し、実行ループに戻るときは、現在のメソッドの終了を参照しています。つまり、autoreleased配列を保持したいのであれば、その特定のメソッドが終了する前に行うべきです。 –

+0

@chrisいいえ、私が指摘した指針として、問題を起こさずにオブジェクトを即時呼び出しメソッドに戻すことができます。一般的に、コードフローに従って、メソッドの終わりがコードを終了してシステムに戻るときを把握できます。たとえば、あなたのメソッドが 'touchesBegan'か何かから呼び出された場合、最終的にはtouchesBeganの最後に到達し、その後、オートレリースされたものは次のUIレスポンスのために固執することはありません。 – zem

+0

あなたのコードがdrawRectやディスプレイリンクのコールバックなどの下位レベルにある場合は、コードを別のものにすることを決定するまで、システムの制御権を放棄していることを簡単に把握できます。ほとんどのココアアプリはスクリプトではありません。あなたのコードは最初から最後までまっすぐ実行されません。タイミングまたはUIイベントに応答してシステムによって呼び出されます。これらの呼び出しの間に、デフォルトの自動解放プールが排水されます。 – zem

関連する問題