2011-11-02 17 views
63

estoy (tratando de) aprender Objective-C y sigo viniendo a través de una frase como:¿Cuál es el significado de id?

-(id) init; 

y entiendo id es una palabra clave de lenguaje Objective C, pero ¿qué significa decir "el compilador específicamente trata id en términos de las reglas de conversión de tipo de puntero "?

¿id designa automáticamente el objeto a su derecha como un puntero?

+20

es lo contrario del ego. Para algunas personas que es 'void *' –

+0

Aquí hay una discusión relevante a la pregunta: [SO question] (http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -instead-of-id/14652187 # 14652187) – dmitri

Respuesta

79

id es un puntero a cualquier tipo, pero a diferencia de void * siempre apunta a un objeto Objective-C. Por ejemplo, puede agregar cualquier cosa del tipo id a un NSArray, pero esos objetos deben responder a retain y release.

El compilador está totalmente feliz de poder lanzar implícitamente cualquier objeto al id, y para que eche id a cualquier objeto. Esto es diferente a cualquier otro lanzamiento implícito en Objective-C, y es la base para la mayoría de los tipos de contenedores en Cocoa.

+0

Suplemento: la definición de 'id' es 'typedef struct objc_object * id;', por lo que apunta a un objeto 'Objc'. – zhongwuzw

17

id es un tipo genérico. Esto significa que el compilador esperará objeto escriba allí, y no hará cumplir las restricciones. Puede ser útil si esperas usar más de una clase de objetos allí; luego puede usar la introspección para descubrir de qué clase se trata. id automáticamente asume un puntero, ya que todos los objetos en Objective-C se pasan como punteros/referencias.

algunos recursos adicionales:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing

26

id es un puntero a cualquier objeto Objective-C (objc_object). No es solo un puntero nulo y no deberías tratarlo como tal. Hace referencia a un objeto que debe tener un puntero isa válido. Los valores que se pueden almacenar en id tampoco se limitan a NSObject y sus descendientes, lo que comienza a dar sentido a la existencia del protocolo NSObject, así como a la clase NSProxy que ni siquiera hereda de NSObject. El compilador le permitirá asignar un objeto referenciado por tipo id a cualquier tipo de objeto, asignar cualquier tipo de objeto a id, así como enviar cualquier mensaje (que el compilador haya visto) sin previo aviso.

4

Sí y no. Es cierto que tener id x designa x como un puntero, pero decir que las reglas de conversión de tipo de puntero se aplican es incorrecto, porque "id" tiene reglas de conversión de tipo especial. Por ejemplo, con un puntero void * no se puede hacer esto:

void *x; 
char *y = x; // error, this needs an explicit cast 

Por el contrario, es posible con id:

id x; 
NSString *y = x; 

Ver más uso de tipo id in objective c examples.

Además en el objetivo "moderno" C, se prefiere usar instancetype en lugar de "id" en los métodos "init". Incluso hay una herramienta de conversión automática en Xcode para cambiar eso. leer sobre instanceType: Would it be beneficial to begin using instancetype instead of id?

3
  • “id” es un tipo de datos de identificadores de objetos en Objective-C, que pueden ser uso de un objeto de cualquier tipo, no importa lo que la clase qué tiene. "id" es el súper tipo final de todos los objetos.

en Java o C# utilizamos como esto

Object data = someValue; 


String name =(Object)data; 

pero en Objective C

id data= someValue; 



NSString *name= data; 
Cuestiones relacionadas