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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top