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