14

据我了解,instancetype 向编译器声明方法的返回类型与接收消息的类相同。

传统上,我总是将类名显式设置为返回类型来声明我的单例初始化程序:

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

现在我想知道是否应该使用 instancetype ,如下所示:

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

最后结果是一样的,我只是想知道这里是否有理由使用其中一个?

4

2 回答 2

18

instancetype对于涉及继承的情况很有用。考虑你有A继承自 class 的类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 回答