Objective-C支持一种称为`instancetype的特殊类型,只能用作方法返回的类型。它评估接收对象的类。
考虑以下类层次结构:
@interface Foo : NSObject - (instancetype)initWithString:(NSString *)string; @end @interface Bar : Foo @end
当[[Foo alloc] initWithString:@"abc"]被调用时,编译器可以推断返回类型为Foo *。本Bar类源自Foo但未重写的初始化函数的声明。但是,多亏了instancetype,编译器可以推断出它[[Bar alloc] initWithString:@"xyz"]返回type的值Bar *。
考虑的返回类型-[Foo initWithString:]是Foo *相反:如果你会打电话[[Bar alloc] initWithString:],编译器会推断Foo *返回,而不是Bar *因为是开发者的意图。在instancetype解决了这个问题。
在引入instancetype初始化程序之前,静态方法(例如单例访问器)和想要返回接收类实例的其他方法需要返回id。问题在于这id意味着“任何类型的对象”。因此,编译器无法检测到NSString *wrong = [[Foo alloc] initWithString:@"abc"];正在分配给类型错误的变量。
由于此问题,初始化程序应始终使用instancetype而不是id作为返回值。