" auto"之间的主要区别是什么?和" instancetype"类型?

时间:2014-02-27 07:23:31

标签: ios objective-c

auto和铿锵类型instancetype之间有什么区别? 我们必须使用auto以及我们必须使用instancetype的位置?

3 个答案:

答案 0 :(得分:6)

Objective C中的

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是没有说明符的局部变量的默认值。其他人是externregisterstatic。 Objective-C也有__block,C11有_Thread_local
  • instancetype表示返回类型是封闭 1 接收类的实例。它可以从Objective-C方法返回,但不作为参数传递。如果您使用它而不是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,因此编译器会产生错误。