Objective-C: come prevenire perdite di astrazione
-
23-09-2019 - |
Domanda
mi sembra di capire che in Objective-C devo dichiarare le variabili di istanza come parte dell'interfaccia della mia classe, anche se queste variabili sono dettagli di implementazione e hanno accesso privato.
In C "soggettiva", posso dichiarare una variabile nel mio file .c e non è visibile al di fuori di tale unità di compilazione. Posso dichiararlo nel file .h corrispondente, e poi tutti coloro che collega in quella unità di compilazione riesco a vedere la variabile.
Mi chiedo se non v'è una scelta equivalente in Objective-C, o se devo davvero dichiarare ogni Ivar nel .h per la mia classe.
Ari.
Soluzione
Ari,
Un buon riferimento a come realizzare esempio dichiarazioni di variabili "invisibili" può essere trovato qui con credito rispettosamente dato a Matt Gallagher.
Speranza che aiuta, Frank
Altri suggerimenti
Le variabili di istanza sono stati tradizionalmente necessario per determinare la dimensione della classe. E 'sempre stato cattive pratiche per accedere direttamente alle Ivars, e che non è il punto. In fase di esecuzione moderna, questo è meno necessario, ma in ogni caso, non si tratta di una perdita di astrazione a meno che i clienti si affidano a Ivars della classe, che dovrebbe essere impossibile, poiché li stai dichiarando come @protected
o @private
, giusto?
Per limitare l'accesso, è possibile utilizzare i @private
o @protected
parole chiave:
@interface Foo : NSObject {
@private
int barPrivate;
@protected
int barProtected;
@public
int barPublic;
}
@end
EDIT:. Scratch tutto, risulta ho davvero bisogno di dormire un po '
Ivars sono @protected
di default (anche se @private
e @protected
non garantiscono che le altre classi non possono accedervi - è sempre possibile accedere ivars con getValue:forKey:
). Non si dovrebbe mai accedere direttamente ivars di altre classi direttamente, in ogni caso - la "scelta" è se non esporre le Ivars come proprietà (si devono solo fare affidamento su tutte le classi seguendo la convenzione di non accedere direttamente ivars).
Nel nuovo Objective-C runtime, non si deve dichiarare Ivars a tutti, dal momento che possono essere sintetizzati in fase di esecuzione, ma purtroppo non funziona con il simulatore di iPhone, quindi per ora, è meglio solo per dichiarare tutti i Ivars nel file h.