20

[[MyClass alloc] init]標準パターンとは別に、一部のオブジェクトは次のような静的メソッドから構築されますMyClass *obj = [MyClass classWithString:@"blabla"]

広く普及しているメモリ管理ガイド(Appleを含む)によると、あなたは自分が持っているオブジェクトを解放することだけに責任がありますalloc

誰かがそのようなメソッドのテンプレートを私に提供できますか?割り当てられたオブジェクトをどのように返しますか([self alloc]; return self;おそらく)?それがリリースされることをどのように確認しますか?

4

4 に答える 4

48

これらはクラスメソッドであり、静的メソッド1ではありません。自動解放されたオブジェクトを作成するこの特定のタイプは、「ファクトリメソッド」(以前は「コンビニエンスコンストラクター」とも呼ばれていました)と呼ばれ、ObjCガイド概念で説明されています。彼らはこのようになります:

+ (instancetype)whatsisWithThingummy: (Thingummy *)theThingummy {
    return [[self alloc] initWithThingummy:theThingummy];
}

Whatsisあなたのクラスはどこにあり、Thingummyあなたのクラスが使用する別のクラスです。

ARCでコンパイルしていない場合、慣例はautoreleaseインスタンスを返す前にインスタンスに適用されます。

このinstancetypeキーワードは、これらの種類のメソッドのためにClangによって導入されました。self(クラスメソッドのクラスオブジェクト自体2 )と組み合わせると、正しいサブクラスの動作が可能になります。メソッドは、メッセージを受信したクラスのインスタンスを生成します。3 instancetypeを使用すると、コンパイラはより厳密な型チェックを実行できますid

フレームワークのサブクラスでのこの使用法の図:インスタンスを+[NSString stringWithFormat:]返しますが、は、メソッドを明示的にオーバーライドする必要なしに、サブクラスのインスタンスを返します。NSString+[NSMutableString stringWithFormat:]NSMutableStringNSMutableString

[ Fundamentals ] [1] docで説明されているように、シングルトンへのアクセスや、実行前に必要なメモリ割り当ての評価など、これらのファクトリメソッドには他の用途があります(標準/ペアでは可能ですが、あまり便利ではありません)。 。allocinit


1JavaまたはC++の「静的メソッド」、Objective-Cの「クラスメソッド」 。ObjCには静的メソッドのようなものはありません

2一方、インスタンスメソッドselfでは、賢明なことに、インスタンスへの参照です。

3以前は、通常の初期化メソッドinitWith...)とid同様に、戻り型として使用していました。特定のクラス名を使用すると、サブクラスがメソッドをオーバーライドするように不必要に強制されます。

于 2011-05-13T06:24:17.463 に答える
4

ファクトリメソッドから返されるオブジェクトは自動解放する必要があります。つまり、関連する自動解放プールが空になると、オブジェクトはクリーンアップされます。これは、あなたcopyまたはretainそれらを除いて、返されたオブジェクトを所有していないことを意味します。次に、ファクトリメソッドの例を示します。

+ (id)myClassWithString:(NSString *)string {
    return [[[MyClass alloc] initWithString:string] autorelease];
}
于 2011-05-13T06:23:53.803 に答える
2

これらのメソッドは、オブジェクトの自動リリースバージョンを返すだけです。

+(MyClass*)class
{
  MyClass* object = [[MyClass alloc] init];
  return [object autorelease];
}
于 2011-05-13T06:24:31.720 に答える
1

ARCと最新のコンパイラを使用してこれを行う最新の方法は次のとおりです。

+ (instancetype) myClassWithString:(NSString *)string {
     return [[MyClass alloc] initWithString:string];
}
  • ARCで自動リリースする必要はありません。
  • instancetypeサブクラス化を可能にしながら、コンパイル時のチェックを改善します。
于 2013-07-16T12:16:24.773 に答える