¿Cuál es la diferencia principal entre el tipo "auto" y "instancetype"?

¿Cuál es la diferencia entre auto y clang tipo instancetype ?
¿Dónde tenemos que usar auto y dónde tenemos que usar instancetype ?

auto en el Objetivo C se henetworkinga de C y significa auto palabra key

Define una variable local como tener una vida local.

Auto de palabras key utiliza la siguiente syntax:

[auto] definición de datos; Como el time de vida local es el pnetworkingeterminado para las variables locales, la palabra key automática se usa muy raramente.

Nota: GNU C amplía la palabra key automática para permitir la statement de funciones anidadas.

Si está buscando el equivalente para C ++ 11's auto o C # 's var – en Objetivo C se usa.

 id a = [NSString new]; id b = [NSNumber new]; 

Pero id no se resuelve en tipo concreto en time de compilation como lo hace auto en C ++ 11.

instancetype es una palabra key contextual que se puede usar como tipo de resultado para indicar que un método devuelve un tipo de resultado relacionado. Por ejemplo:

 @interface Person + (instancetype)personWithName:(NSString *)name; @end 

instancetype , a diferencia de id, solo puede usarse como tipo de resultado en una statement de método.

Con instancetype, el comstackdor inferirá correctamente que el resultado de + personWithName: es una instancia de una Persona. Y generará un error si intentas llamar

 [[Person personWithName:@"Some Name"] methodThatNotExistsInPerson]; 

Si usa el comstackdor de id no lo hará, no lo reparará y recibirá un error de time de ejecución.

Instancetype se usa para agregar un poco más de "escritura fuerte" al Objetivo C.

Si te refieres a auto no están relacionados.

  • auto es una class de almacenamiento C99. Las classs de almacenamiento definen el scope y la visibilidad de las variables y funciones. auto es el valor pnetworkingeterminado para las variables locales sin un especificador. Los demás son extern , de register , static . Objective-C también tiene __block , y C11 tiene _Thread_local .
  • instancetype indica que el tipo de retorno es una instancia de la class receptora de 1 que encierra . Se puede devolver desde un método Objective-C, pero no se pasa como argumento. Si lo usa en su lugar id , LLVM detectará asignaciones incorrectas entre diferentes types. Úselo en constructores e inicializadores estáticos.

1 La recepción de classs es un término mejor porque las subclasss no necesitan networkingefinir el tipo de instancetype para que devuelva el tipo de subclass.

Como lo afirman otros auto es una palabra key que rara vez se usa, olvídalo.

instancetype es una introducción reciente que permite que los methods sigan el patrón init . En Objective-C, los methods que comienzan con init devuelven un object cuyo tipo es el de la class receptora , es decir, el tipo de self dentro del método. Se dice que un método init tiene un tipo de resultado relacionado . Considerar:

 @interface A : NSObject - (id) initWithString:(NSString *)text; @end @interface B : A @end 

Luego para la expresión:

 [[A alloc] initWithString:@"An instance of A"] 

el comstackdor sabe que el tipo del resultado es A * lugar del id less específico declarado para initWithString: porque los methods initX tienen un tipo de resultado relacionado.

Más aún por la expresión:

  [[B alloc] initWithString:@"An instance of B"] 

el comstackdor sabe que el tipo de resultado es B * como si el método invocado proviene de la class A (por inheritance) se llama a una instancia de B

La introducción de instancetype permite a otros methods declarar que siguen este patrón, proporcionando al comstackdor una información de tipo más precisa, que, por ejemplo, puede usar para resolver references de propiedad. Considerar:

 @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 

El para la expresión:

 [B locateWithString:@"An instance of B"].size 

el comstackdor sabe que locateWithString: devuelve un B * y tiene un size propiedad. Antes del tipo de instancetype debería haber utilizado el id tipo, y el id tipo no tiene el size propiedad, por lo que el comstackdor habría producido un error.