1 つはクラス メソッドで、もう 1 つはインスタンス メソッドであることは認識していますが、Apple のドキュメントにはまったく同じ説明があるため、さまざまな構文/ユース ケースをよく理解していません。
3 に答える
これらの機能は同等ですが、クラス メソッドは自動解放されたオブジェクトを返します。つまり、おそらく次のように実装されています。
+ (NSFetchRequest *)fetchRequestWithEntityName:(NSString *)entityName {
return [[[NSFetchRequest alloc] initWithEntityName:entityName] autorelease];
}
これは、クラス ファクトリ メソッドとして知られる、Objective-C ライブラリのかなり一般的なパターンです。
これら 2 つの API の主な違いは次のとおりです。
fetchRequestWithEntityName
自動解放オブジェクトを提供するため、イベントループが終了すると、保持するまでメモリから割り当てが解除されます。
しかしinitWithEntityName
、あなたが解放するオブジェクトを提供します。そうしないと、メモリリークが発生します。
あなたが言ったことに基づいて、それらが本当に同じユースケースを持っている場合、Appleが使用するメモリ管理設計によると、唯一の違いはobjective-Cのガベージコレクションに関係しています。
オブジェクトに対してメソッドを呼び出すときはいつでもinit
、それを所有し、オブジェクトが不要になったときにそれを解放する責任があります。
オブジェクトを返す他の種類のメソッドを呼び出すと、そのオブジェクトは a に追加され、プールがドレインされると d になりますNSAutoreleasePool
。autorelease
ここでさらに洞察を得ることができます。
したがって、Apple の方法に従って、後で使用するためにオブジェクトを保存したくない場合は、呼び出すことができfetchRequestWithEntityName
、メソッド呼び出しの最後にオブジェクトを解放することを心配する必要はありません。インスタンス変数として保存する場合は、initWithEntityName
メソッドを呼び出します。もちろん、それらを交換することもできますが、このアプローチは、メモリ管理に関する Apple のガイドラインに従います。
-(void)myMethod {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id obj1 = [[Object alloc] initWithEntityName:...];
id obj2 = [Object fetchRequestWithEntityName:...];
//obj1 retain count is +1
//obj2 retain count is +0 (likely autoreleased)
[pool drain];
//obj1 still exists
//obj2 is no longer valid; may or may not have been deallocated
}
したがって、基本的にfetchRequestWithEntityName
は、次の方法で達成されます。
+(id)fetchRequestWithEntityName:... {
return [[[self class] alloc] initWithEntityName:...] autorelease];
}