instancetype vs singleton的类名?

时间:2013-05-24 20:51:47

标签: objective-c singleton instancetype

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

传统上我总是声明我的单例初始值设定项,并将类名显式设置为返回类型:

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

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

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

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

2 个答案:

答案 0 :(得分:18)

instancetype对涉及继承的情况很有用。请考虑您拥有继承自类A的类B。返回B实例的B中的方法可以先声明为id,其A中的覆盖可能会返回A的实例 - 这是一切都很好,但编译器没有任何线索。但是,通过使用实例类型,编译器会被告知在A实例上调用该方法返回A实例时,可以提供更好的诊断,代码完成等。

现在,在您的示例中,您使用了MyClass *而不是id,因此您已经告诉编译器类型。您还有一个共享实例模型(不是 singleton 模型,因为您可以使用MyClass的其他实例),您是否可能定义另一个继承自{的类{1}}并覆盖MyClass方法?可能不是,但如果你做sharedInstance可能有用,否则它什么也得不到。

答案 1 :(得分:4)

传统上,构造方法返回id,允许子类也使用它们。

id当然意味着“任何对象”。在分配构造函数方法的结果时,引入了instancetype以提供更多类型的严格性。

它仅在子类化的情况下有用。如果永远不会覆盖该方法,最好尽可能明确并使用实际的类名。