これらはクラスメソッドであり、静的メソッド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:]
NSMutableString
NSMutableString
[ Fundamentals ] [1] docで説明されているように、シングルトンへのアクセスや、実行前に必要なメモリ割り当ての評価など、これらのファクトリメソッドには他の用途があります(標準/ペアでは可能ですが、あまり便利ではありません)。 。alloc
init
1JavaまたはC++の「静的メソッド」、Objective-Cの「クラスメソッド」 。ObjCには静的メソッドのようなものはありません
2一方、インスタンスメソッドself
では、賢明なことに、インスタンスへの参照です。
3以前は、通常の初期化メソッド(initWith...
)とid
同様に、戻り型として使用していました。特定のクラス名を使用すると、サブクラスがメソッドをオーバーライドするように不必要に強制されます。