以下のコードを見ていてください: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;
}
を、私はどこか別の結果を使用する必要があり、この方法では、正しく(保持することなく、または自動解放)返された結果ですか?また、呼び出し元が結果を取得したり、保持したり、すぐに使用したりするときに、呼び出し元は何をすべきですか?
ありがとうございます!
私が間違っている場合は、@ zemを修正してください。しかし、あなたのコードが終了し、実行ループに戻るときは、現在のメソッドの終了を参照しています。つまり、autoreleased配列を保持したいのであれば、その特定のメソッドが終了する前に行うべきです。 –
@chrisいいえ、私が指摘した指針として、問題を起こさずにオブジェクトを即時呼び出しメソッドに戻すことができます。一般的に、コードフローに従って、メソッドの終わりがコードを終了してシステムに戻るときを把握できます。たとえば、あなたのメソッドが 'touchesBegan'か何かから呼び出された場合、最終的にはtouchesBeganの最後に到達し、その後、オートレリースされたものは次のUIレスポンスのために固執することはありません。 – zem
あなたのコードがdrawRectやディスプレイリンクのコールバックなどの下位レベルにある場合は、コードを別のものにすることを決定するまで、システムの制御権を放棄していることを簡単に把握できます。ほとんどのココアアプリはスクリプトではありません。あなたのコードは最初から最後までまっすぐ実行されません。タイミングまたはUIイベントに応答してシステムによって呼び出されます。これらの呼び出しの間に、デフォルトの自動解放プールが排水されます。 – zem