14

私が理解していることから、instancetype は、メソッドの戻り値の型がメッセージを受信するクラスと同じであることをコンパイラに宣言します。

伝統的に、戻り値の型として明示的に設定されたクラス名を使用して、シングルトン初期化子を常に宣言してきました。

@interface MyClass : NSObject
+ (MyClass *)sharedInstance;
@end

次のように、代わりに instancetype を使用する必要があるかどうか疑問に思っています。

@interface MyClass : NSObject
+ (instancetype)sharedInstance;
@end   

最終的に結果は同じですが、ここでどちらかを使用する理由があるかどうか疑問に思っていますか?

4

2 に答える 2

18

instancetype継承が関係する状況で役立ちます。classAから継承するクラスがあるとしますBBのインスタンスを返すメソッドは、B以前に として宣言されている可能性がありid、そのオーバーライドAは - のインスタンスを返す可能性がありますA。これはすべて問題ありませんが、コンパイラには手がかりがありません。ただし、インスタンス型を使用することで、Aインスタンスで呼び出されたときにメソッドがAインスタンスを返すことがコンパイラに通知されるため、より良い診断、コード補完などを提供できます。

あなたの例MyClass *では ではなくを使用idしたので、すでにコンパイラに型を伝えています。また、共有インスタンスモデル (の他のインスタンスのようにシングルトンMyClassモデルではない) を持っています。メソッドを継承しMyClassてオーバーライドする別のクラスを定義する可能性はありますsharedInstanceか? おそらくそうではありませんが、もしそうなら役に立つかもしれませんがinstancetype、そうでなければ何も得られません.

于 2013-05-24T21:24:20.937 に答える
4

コンストラクター メソッドは伝統的に を返しid、サブクラスもそれらを使用できるようにします。

idもちろん、「あらゆるオブジェクト」を意味します。instancetypeコンストラクター メソッドの結果を代入するときに、型の厳密性をもう少し高めるために導入されました。

サブクラス化の場合にのみ役立ちます。そのメソッドが決してオーバーライドされない場合は、できるだけ明示的にして実際のクラス名を使用することをお勧めします。

于 2013-05-24T21:23:00.437 に答える