En Objective-C ID es un typedef:Objetivo-C; typedef objc_object como sustituto de id sin puntero;
typedef struct objc_object {
Class isa;
} *id;
Así que puede declarar (e inicializar) un ejemplo variable de como este:
// using id
id po_one = @"one";
Compilar bien.
Desde que el nombre de mi tipos en un esquema propio y ya que me gusta el puntero implícita en el ello typedef Quiero añadir una propia typedef (con O para objeto) como esto:
typedef struct objc_object O;
Así una variable Declaración (con inicialización) podría verse como:
// using O
O * po_two = @"two";
Esto compila con una advertencia:
inicialización de i puntero ncompatible tipo
Por lo que yo entiendo typedefs pensé que este último debe ser equivalente a:
// using struct objc_object
struct objc_object * po_three = @"three";
que de nuevo compila bien.
Es asombroso que:
po_two = po_one;
po_two = po_three;
tanto compilar sin advertencias.
así que he intentado:
typedef struct objc_object * PO;
para ver si funciona sin previo aviso si incluyo el puntero (siendo exactamente lo que quiero evitar - por lo que sólo por razones de prueba) para ver si un typedef fuera del la definición de estructura funciona de manera diferente a un typedef en la definición de estructura (que es la definición de id en este caso).
// using PO
PO po_four = @"four";
Eso también funciona bien.
Si uso:
#define O struct objc_object
el constructo utilizando O compila de nuevo sin advertencia.
Pero prefiero usar typedefs en lugar de a define siempre que sea posible.
Estoy perplejo. ¿Cuál es mi malentendido con typedefs?
¿Qué compilador? – JeremyP
Además, podría usar 'NSObject *' en lugar de 'O *', p. Ej. 'NSObject * po_two = @" two ";', en la mayoría de los casos. –