9

Ho iniziato a imparare Objective-C alcune settimane fa e ancora non capisco come gestire correttamente l'incapsulamento di una classe. Qual è il modo migliore per dichiarare una variabile membro privata in una classe?Dichiarazione di variabili membro private

Sembra che l'impostazione del getter/setter corretto per la variabile membro con "@property" sia la giusta via da seguire, oltre alla semplice dichiarazione "@private" nell'interfaccia. Ma mi sembra che questo dia ancora ad altre classi un accesso a queste variabili. Anche se dichiari la proprietà "readonly", una classe esterna può accedere al riferimento alla variabile membro e modificarla!

Quindi sto indovinando il modo migliore per dichiarare una variabile membro privato è quello di non includere alcun guetter/setter non dichiarando una proprietà. Ho ragione? O c'è un modo migliore?

Grazie

risposta

23

se non si vuole accessibile ad altre classi, dichiarare il @property sulla vostra implementazione, la creazione di una categoria anonima per la classe.

file di intestazione:

// MyClass.h 
@interface MyClass : NSObject { 
    NSObject *_privateObject; 
    NSObject *_readonlyObject; 
    NSObject *_publicObject; 
} 

@property (nonatomic, retain, readonly) NSObject *readonlyObject; 
@property (nonatomic, retain) NSObject *publicObject; 

@end 

Implementazione:

// MyClass.m 
@interface MyClass() 
    @property (nonatomic, retain) NSObject *privateObject; 
    // Make it writable on the implementation 
    @property (nonatomic, retain, readwrite) NSObject *readonlyObject; 
@end 

@implementation MyClass 

@synthesize privateObject = _privateObject; 
@synthesize readonlyObject = _readonlyObject; 
@synthesize publicObject = _publicObject; 

Questi sono esempi di tre diverse proprietà.

  • privateObject non è visibile in altre classi;
  • readonlyObject è visibile ma è di sola lettura;
  • publicObject è visibile e può essere ottenuto e impostato;
+0

Ok, quindi utilizzando una categoria posso nascondere totalmente una variabile membro. Ma non riesco ancora ad usare "readonly" per un membro visibile, poiché restituisce il riferimento all'oggetto. Si può semplicemente modificare il riferimento e scrivere su di esso, anche se non ha setter. –

+0

Buon punto! Proverò a indagare su quale tipo di protezione obiettivo-c dare ad esso. La mia ipotesi è che non appena si tenta di cambiare il valore dell'oggetto referenziato si fa una copia e le modifiche non si propagano all'oggetto protetto. Ecco la documentazione: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 – vfn

+0

@Oliver , ti dispiacerebbe creare un'altra domanda per questo, e mettere il tuo codice lì per darci una migliore comprensione di questo problema. "Selettore non riconosciuto" di BTW significa che non hai quel selettore specifico, che può essere una proprietà o un metodo. Sei sicuro di aver dichiarato la proprietà con privilegi di "readwrite"? – vfn

Problemi correlati