auto
和铿锵类型instancetype
之间有什么区别?
我们必须使用auto
以及我们必须使用instancetype
的位置?
答案 0 :(得分:6)
auto
继承自C,意味着auto keyword
将局部变量定义为具有本地生命周期。
Keyword auto使用以下语法:
[auto]数据定义;由于本地生命周期是本地的默认值 变量,auto关键字极少使用。
注意:GNU C扩展auto关键字以允许前向声明 嵌套函数。
如果您正在寻找C ++ 11 auto
或C#var
的等价物 - 在目标C id
中使用。
id a = [NSString new];
id b = [NSNumber new];
但是id
在编译时没有解析为具体类型,就像C ++ 11中的auto
一样。
instancetype
是一个上下文关键字,可用作结果类型,表示方法返回相关的结果类型。例如:
@interface Person
+ (instancetype)personWithName:(NSString *)name;
@end
与id不同,instancetype只能用作方法声明中的结果类型。
使用instancetype,编译器将正确地推断出+ personWithName:的结果是Person的一个实例。如果您尝试拨打
,将会产生错误[[Person personWithName:@"Some Name"] methodThatNotExistsInPerson];
如果您将使用id
编译器不会这样做,您将无法修复它并将收到运行时错误!
Instancetype用于为Objective C添加更多“强类型”。
答案 1 :(得分:0)
如果你的意思是auto
他们是无关的。
auto
是C99存储类。存储类定义变量和函数的范围和可见性。 auto
是没有说明符的局部变量的默认值。其他人是extern
,register
,static
。 Objective-C也有__block
,C11有_Thread_local
。 instancetype
表示返回类型是id
,LLVM将检测不同类型之间的错误分配。在构造函数和静态初始化器中使用它。 1 接收类是一个更好的术语,因为子类不需要重新定义instancetype
来返回子类类型。
答案 2 :(得分:0)
正如其他人所说auto
是一个很少使用的关键字,请忘掉它。
instancetype
是最近的介绍,它允许方法遵循init
模式。在以init
开头的Objective-C方法中,返回一个类型为接收类的对象 - 换句话说,该方法中的self
类型。据说init
方法具有相关结果类型。考虑:
@interface A : NSObject
- (id) initWithString:(NSString *)text;
@end
@interface B : A
@end
然后是表达式:
[[A alloc] initWithString:@"An instance of A"]
编译器知道结果的类型是A *
,而不是为id
声明的不太具体的initWithString:
,因为initX
方法具有相关的结果类型。
表达式的更多内容:
[[B alloc] initWithString:@"An instance of B"]
编译器知道结果的类型是B *
,好像调用的方法来自类A
(通过继承),它在B
的实例上调用。
instancetype
的引入允许其他方法声明它们遵循这种模式,从而为编译器提供更精确的类型信息 - 例如,它可以用来解析属性引用。考虑:
@interface A : NSObject
// returns an instance of A or whatever subtype of A it is called on
+ (instancetype) locateWithString:(NSString *)text;
@end
@interface B : A
@property NSInteger size;
@end
表达式:
[B locateWithString:@"An instance of B"].size
编译器知道locateWithString:
返回B *
,因此具有属性size
。在instancetype
之前,必须使用类型id
,类型id
没有属性size
,因此编译器会产生错误。