Dichiarazioni multiple @interface generate da xcode per nsviewcontroller?
-
21-12-2019 - |
Domanda
Sto facendo un'applicazione di cacao e usando XCode per varie generazioni di codice.Funziona bene per generare file .h e .m per la sottoclassante UIView, ma quando la sottoclasse UIViewController ricevo una dichiarazione di @interface
identica in entrambi i file, tranne che nel file .m ha ( )
alla fine:
//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>
@end
.
ma anche
//in MyViewController.m
@interface MyViewController ()
@end
@implementation MyViewController
@end
.
Eppure si compensa bene.Quindi, supponendo che questo sia un comportamento normale, le due parti della domanda sono: (A) Perché questo accade, e (B) Quali sono i risultati - specialmente in termini di ordine di compilazione?
Grazie!
Soluzione
.Quando la sottoclasse UIViewController ricevo una dichiarazione @interface identica in entrambi i file, tranne che nel file .m ha ()
Come hai notato, i due blocchi di interfaccia sono non identici - il ()
è importante.Quello con il ()
è un'estensione classe , che è simile a una categoria senza un nome.Le due importanti differenze tra una categoria e un'estensione di classe sono:
- .
-
È possibile dichiarare le variabili di istanza in un'estensione di classe, ma non è possibile in una categoria.
-
Un'estensione della classe deve comparire nello stesso file del blocco di implementazione.
Le estensioni di classe sono utili per dichiarare variabili e metodi di dichiarazione dell'istanza che non si desidera esporre nel file di intestazione, come metodi o variabili specifiche per l'implementazione e non dovrebbero essere invocati dagli utenti della classe.
Altri suggerimenti
Hai familiarità con le categorie?Quello che stai osservando è simile, ma ha importanti distinzioni dalle categorie.La distinzione qui è che è anonimo (da qui il parente vuoto) e compilato allo stesso tempo la classe originale è compilata.La parte successiva è una parte importante: significa che è possibile aggiungere proprietà di istanza (stoccaggio).Questo è più comunemente usato per dichiarare "solo solo interni" o metodi e proprietà "privati".Ma tieni presente che in fase di esecuzione non è nozione di applicazione "privata", si tratta di quale interfaccia hai pubblicato vs. non pubblicato.Questo è solo un modo per avere un'interfaccia molto chiaramente definita che è "pubblicata" solo per le persone che aumenteranno il file di implementazione della classe principale.