Estoy (tratando de) aprender Objective-C y sigo encontrando una frase como:
-(id) init;
Y entiendo que id
es una palabra clave del lenguaje Objective C, pero ¿qué significa decir "el compilador trata específicamente id
en términos de las reglas de conversión de tipo de puntero"?
¿ id
Designa automáticamente el objeto a su derecha como puntero?
objective-c
types
GPP
fuente
fuente
void*
Respuestas:
id
es un puntero a cualquier tipo, pero a diferencia devoid *
que siempre apunta a un objeto Objective-C. Por ejemplo, puede agregar cualquier tipoid
a un NSArray, pero esos objetos deben responder aretain
yrelease
.El compilador está totalmente feliz de que usted envíe implícitamente cualquier objeto
id
y de que usted lo hagaid
a 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.fuente
id
La definición de Supplement: estypedef struct objc_object *id;
, por lo que apunta a unObjc
objeto.NSObject
? significa, ¿puedo reemplazarid
conNSObject
cuando es un tipo de devolución?id
es 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 unisa
puntero válido . Los valores en los que se pueden almacenarid
tampoco se limitan aNSObject
y sus descendientes, lo que comienza a dar sentido a la existencia delNSObject
protocolo, así como a laNSProxy
clase de la que ni siquiera heredaNSObject
. El compilador le permitirá asignar un objeto referenciado por tipoid
a cualquier tipo de objeto, asignarle cualquier tipo de objetoid
y enviarle cualquier mensaje (que el compilador haya visto) sin previo aviso.fuente
id
es 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.id
asume 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
fuente
En java o c # usamos así
pero en el objetivo c
fuente
Si y no. Es cierto que tener
id x
designa 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 unvoid *
puntero no puede hacer esto:Por el contrario, es posible con id:
Ver más uso de id de tipo en ejemplos de objetivo c .
Además, en el "moderno" Objective C se prefiere usar en
instancetype
lugar 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?fuente