1

Objective-C で instancetype を使用することに混乱しています。

コード:

@interface MyClass : NSObject

-(instancetype)initWithOwner:(NSString*)anOwner;

@property (nonatomic, strong) NSString* owner;
@end


@interface MyChildClass : MyClass

-(instancetype)init;

@property (nonatomic, strong) NSString* myString;
@end

次に、これを実行できます

MyChildClass* myChildObject = [[MyChildClass alloc] initWithOwner:@"owner"];

これが MyClass ではなく MyChildClass を返すのはなぜですか ???

MyChildClass 初期化メソッドではなく、スーパークラスの初期化メソッドを使用しているという警告またはエラー メッセージがコンパイラに表示されないのはなぜですか ???

これはどこで使用できますか???

4

1 に答える 1

1
  1. 質問(クエスチョンマーク1~3)

これは のためですinstancetype。それは言います:戻りインスタンスは、レシーバーと同じタイプ(またはサブクラス)です。

[[MyChildClass alloc] initWithOwner:@"owner"];

意味:

[[MyChildClass alloc] -> MyChildClass
                                      initWithOwner:@"owner"] -> MyChildClass;
  1. 質問(クエスチョンマーク4~6)

a. Objective-C にはファクトリ メソッドはありません。Objective-C にはメソッドがあります。

b. すべて問題ないため、コンパイラは警告を表示しません。MyChildClassタイプ の参照変数への参照を割り当てますMyChildClass

  1. 質問(クエスチョンマーク7~9)

これを例で使用できます。MyChildClass変更したくない場合は、基本クラスの実装を使用できます。(よく。)

ところで: 返されたインスタンスがタイプであることを知っていますMyChildClassか?

于 2014-12-19T12:40:27.830 に答える