有人可以简单地向我解释为什么在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

09-27 05:25