¿Cuál es el significado de id?

97

Estoy (tratando de) aprender Objective-C y sigo encontrando una frase como:

-(id) init;

Y entiendo que ides una palabra clave del lenguaje Objective C, pero ¿qué significa decir "el compilador trata específicamente iden términos de las reglas de conversión de tipo de puntero"?

¿ idDesigna automáticamente el objeto a su derecha como puntero?

GPP
fuente
28
Es lo opuesto al ego. Para algunas personas eso esvoid*
Hot Licks
Aquí hay una discusión relevante a la pregunta: Pregunta SO
dmitri

Respuestas:

122

ides un puntero a cualquier tipo, pero a diferencia de void *que siempre apunta a un objeto Objective-C. Por ejemplo, puede agregar cualquier tipo ida un NSArray, pero esos objetos deben responder a retainy release.

El compilador está totalmente feliz de que usted envíe implícitamente cualquier objeto idy de que usted lo haga ida cualquier objeto. Esto es diferente a cualquier otra conversión implícita en Objective-C, y es la base para la mayoría de los tipos de contenedores en Cocoa.

joerick
fuente
11
id La definición de Supplement: es typedef struct objc_object *id;, por lo que apunta a un Objcobjeto.
zhongwuzw
es lo mismo que NSObject? significa, ¿puedo reemplazar idcon NSObjectcuando es un tipo de devolución?
ThunderWiring
Documento de
33

ides un puntero a cualquier objeto Objective-C ( objc_object). No es solo un puntero vacío y no debe tratarlo como tal. Hace referencia a un objeto que debería tener un isapuntero válido . Los valores en los que se pueden almacenar idtampoco se limitan a NSObjecty sus descendientes, lo que comienza a dar sentido a la existencia del NSObjectprotocolo, así como a la NSProxyclase de la que ni siquiera hereda NSObject. El compilador le permitirá asignar un objeto referenciado por tipo ida cualquier tipo de objeto, asignarle cualquier tipo de objeto idy enviarle cualquier mensaje (que el compilador haya visto) sin previo aviso.

Joe
fuente
25

ides un tipo genérico. Esto significa que el compilador esperará cualquier tipo de objeto allí y no impondrá restricciones. Puede ser útil si espera utilizar más de una clase de objetos allí; A continuación, puede utilizar la introspección para averiguar de qué clase es. idasume automáticamente un puntero, ya que todos los objetos en Objective-C se pasan como punteros / referencias.

Algunos recursos adicionales:
id vs NSObject vs id *
Programación Objective-C (Wikilibros)
Introspección
Escritura dinámica

FeifanZ
fuente
9
  • id es un tipo de datos de identificadores de objeto en Objective-C, que se puede usar para un objeto de cualquier tipo sin importar qué clase tenga. id es el super tipo final de todos los objetos.

En java o c # usamos así

 Object data = someValue;


 String name =(Object)data;

pero en el objetivo c

id data= someValue;



NSString *name= data;
chancyWu
fuente
5

Si y no. Es cierto que tener id xdesigna x como un puntero, pero decir que se aplican las reglas de conversión de tipo de puntero es incorrecto, porque "id" tiene reglas de conversión de tipo especiales. Por ejemplo, con un void *puntero no 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 id de tipo en ejemplos de objetivo c .

Además, en el "moderno" Objective C se prefiere usar en instancetypelugar de "id" en los métodos "init". Incluso hay una herramienta de conversión automática en Xcode para cambiar eso. Lea sobre instancetype: ¿Sería beneficioso comenzar a usar instancetype en lugar de id?

battlmonstr
fuente