据我了解,instancetype 向编译器声明该方法的返回类型与接收消息的类相同。
传统上,我总是声明我的单例初始值设定项,并将类名显式设置为返回类型:
@interface MyClass : NSObject
+ (MyClass *)sharedInstance;
@end
现在我想知道我是否应该改用 instancetype,像这样:
@interface MyClass : NSObject
+ (instancetype)sharedInstance;
@end
最后结果是一样的,我只是想知道是否有理由在这里使用一个或另一个?
最佳答案
instancetype
对于涉及继承的情况很有用。假设您有类 A
,它继承自类 B
。 B
中返回 B
实例的方法之前可能声明为 id
,它在 A
中的覆盖可能返回 A
的实例 - 这一切都很好,但编译器没有任何线索。然而,通过使用实例类型,编译器被告知当在 A
实例上调用时,该方法返回一个 A
实例,因此可以提供更好的诊断、代码完成等。
现在在您的示例中您使用了 MyClass *
而不是 id
,因此您已经将类型告知编译器。您还有一个共享实例模型(不是单例模型,因为您可以使用 MyClass
的其他实例),您是否可能定义另一个类继承自 MyClass
并覆盖 sharedInstance
方法?可能不是,但如果你这样做,instancetype
可能会有用,否则它什么也得不到。
关于objective-c - 单例的实例类型与类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16743494/