in Objective-C ID è un typedef:Objective-C; typedef objc_object come sostituto dell'ID senza puntatore;
typedef struct objc_object {
Class isa;
} *id;
così posso dichiarare (ed inizializzare) una variabile di esempio in questo modo:
// using id
id po_one = @"one";
compila bene.
Dal momento che il nome del mio tipi in un proprio schema e dal momento che non mi piace il puntatore implicito nel id typedef voglio aggiungere una propria typedef (con O per oggetto) in questo modo:
typedef struct objc_object O;
Quindi una variabile dichiarazione (con l'inizializzazione) potrebbe apparire come:
// using O
O * po_two = @"two";
Questo compila con un avvertimento:
inizializzazione da puntatore ncompatible tipo
Per quanto ho capito typedef ho pensato che quest'ultimo dovrebbe essere equivalente a:
// using struct objc_object
struct objc_object * po_three = @"three";
che compila bene di nuovo.
E 'sorprendente che:
po_two = po_one;
po_two = po_three;
sia compilare senza avvertimenti.
Così ho provato:
typedef struct objc_object * PO;
per vedere se funziona senza preavviso se includo il puntatore (essendo esattamente la cosa che voglio evitare - in modo solo per motivi di prova) per verificare se un typedef al di fuori di la definizione della struttura funziona in modo diverso rispetto a un typedef nella definizione della struttura (che in questo caso è la definizione di id).
// using PO
PO po_four = @"four";
che funziona anche bene.
Se uso:
#define O struct objc_object
costrutto usando O compila ancora una volta senza preavviso.
Ma preferisco usare typedefs invece di una definizione quando possibile.
Sono confuso. Qual è la mia incomprensione con typedef?
Quale compilatore? – JeremyP
Inoltre, potresti usare 'NSObject *' invece di 'O *', ad es. 'NSObject * po_two = @" two ";', nella maggior parte dei casi. –