据我所知,instancetype向编译器声明该方法的返回类型与接收消息的类相同。
传统上我总是声明我的单例初始值设定项,并将类名显式设置为返回类型:
@interface MyClass : NSObject
+ (MyClass *)sharedInstance;
@end
现在我想知道我是否应该使用instancetype,如下所示:
@interface MyClass : NSObject
+ (instancetype)sharedInstance;
@end
最后结果是一样的,我只是想知道是否有理由在这里使用其中一个?
答案 0 :(得分:18)
instancetype
对涉及继承的情况很有用。请考虑您拥有继承自类A
的类B
。返回B
实例的B
中的方法可以先声明为id
,其A
中的覆盖可能会返回A
的实例 - 这是一切都很好,但编译器没有任何线索。但是,通过使用实例类型,编译器会被告知在A
实例上调用该方法返回A
实例时,可以提供更好的诊断,代码完成等。
现在,在您的示例中,您使用了MyClass *
而不是id
,因此您已经告诉编译器类型。您还有一个共享实例模型(不是 singleton 模型,因为您可以使用MyClass
的其他实例),您是否可能定义另一个继承自{的类{1}}并覆盖MyClass
方法?可能不是,但如果你做sharedInstance
可能有用,否则它什么也得不到。
答案 1 :(得分:4)
传统上,构造方法返回id
,允许子类也使用它们。
id
当然意味着“任何对象”。在分配构造函数方法的结果时,引入了instancetype
以提供更多类型的严格性。
它仅在子类化的情况下有用。如果永远不会覆盖该方法,最好尽可能明确并使用实际的类名。