@class
esiste per interrompere le dipendenze circolari. Di 'che hai le classi A e B.
@interface A:NSObject
- (B*)calculateMyBNess;
@end
@interface B:NSObject
- (A*)calculateMyANess;
@end
Pollo; incontrare Egg. Questo non può mai essere compilato perché l'interfaccia di A dipende dalla definizione di B e viceversa.
Quindi, può essere fissato con @class
:
@class B;
@interface A:NSObject
- (B*)calculateMyBNess;
@end
@interface B:NSObject
- (A*)calculateMyANess;
@end
@class
dice efficacemente il compilatore che esiste in qualche luogo e, in tal modo, i puntatori dichiarati per puntare a istanze di detta classe sono perfettamente valide tale classe. Tuttavia, non è possibile chiamare un metodo su un riferimento di istanza il cui tipo è definito solo come @class
perché non sono disponibili metadati aggiuntivi per il compilatore (non mi ricordo se restituisce il sito di chiamata a essere valutato come una chiamata attraverso id
oppure no).
Nel tuo esempio, @class
è innocuo, ma del tutto inutile.
Vorrei poter dare un altro +1 solo per "chicken, meet egg" – lukya
BTW, restituisce la valutazione 'id'. – jheld
Ci sono motivi particolari per cui alcuni individui mettono '@ class' nel loro file .h e poi importano i file di intestazione necessari nel loro file .m, e altri potrebbero semplicemente importare il file .h nel file di intestazione delle classi corrente? Solo curioso, grazie. @bbum –