有人可以简单地向我解释为什么在Objective-C中使用instancetype
吗?
- (instancetype) init {
self = [super init];
if (self) {
// Custom initialization
}
return self;
}
最佳答案
这是为了增加类型的安全性。
过去,初始化程序只返回了id
类型的对象(任何对象)。
对于普通的初始化程序(以“init”,“alloc”或“new”开头的初始化程序),这通常不是问题。编译器将自动推断其返回的类型,因此将对象上的所有方法调用限制为该类的实例方法。
但是,这是静态便利初始化程序或“工厂方法”的问题,它们不一定遵循相同的命名约定,因此无法应用相同的类型安全性。
这意味着使用这样的类:
@interface Foo : NSObject
+(id) aConvenienceInit;
@end
编译器将接受这样的代码:
NSArray* subviews = [Foo aConvenienceInit].subviews;
为什么?因为返回的对象可以是任何对象,所以如果您尝试访问
UIView
属性-没有类型安全性可以阻止您。但是,现在有了
instancetype
,您返回的结果就是给定实例的类型。现在使用此代码:@interface Foo : NSObject
+(instancetype) aConvenienceInit;
@end
...
NSArray* subviews = [Foo aConvenienceInit].subviews;
您将得到一个编译器警告,指出属性
subviews
不是Foo*
的成员:尽管值得注意的是,如果您的方法以“alloc”,“init”或“new”开头,则编译器会自动将返回类型从
id
转换为instancetype
,但是无论如何都应使用instancetype
,这是一种很好的习惯。有关更多信息,请参见
instancetype
上的Apple docs。