9

Empecé a aprender Objective-C hace algunas semanas y todavía no entiendo cómo administrar la encapsulación de una clase correctamente. ¿Cuál es la mejor manera de declarar una variable miembro privada en una clase?Declaración de variables de miembros privados

Parece que establecer el getter/setter correcto para su variable miembro con "@property" es el camino correcto, más que simplemente declararlo como "@private" en la interfaz. Pero me parece que esto todavía le da a otras clases acceso a estas variables. Incluso si declara la propiedad como "de solo lectura", una clase externa puede acceder a la referencia a la variable miembro y modificarla.

Así que supongo que la mejor manera de declarar una variable miembro privada es no incluir ninguna guetter/setter al no declarar una propiedad. Estoy en lo correcto? ¿O hay un mejor camino?

Gracias

Respuesta

23

si no quiere que sea accesible a otras clases, declarar la @property en su aplicación, creando una categoría anónima para su clase.

Archivo de cabecera:

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

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

@end 

Implementación:

// 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; 

Estos son ejemplos de tres propiedades diferentes.

  • privateObject no es visible en otras clases;
  • readonlyObject es visible pero solo es de lectura;
  • publicObject es visible y se puede obtener y configurar;
+0

Ok, entonces usando una categoría puedo ocultar totalmente una variable de miembro. Pero todavía no entiendo el punto de usar "readonly" para un miembro visible, ya que devuelve la referencia al objeto. Uno puede simplemente modificar la referencia y escribir sobre ella, incluso si no tiene un setter. –

+0

¡Buen punto! Trataré de investigar qué tipo de protección objetivo-c darle. Supongo que tan pronto como intente cambiar el valor de su objeto referenciado, haga una copia y los cambios no se propaguen al objeto protegido. Aquí está la documentación: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 – vfn

+0

@Oliver , ¿le importaría crear otra pregunta para eso, y poner su código allí para darnos una mejor comprensión de este problema? Por cierto, "selector no reconocido" significa que no tiene ese selector específico, que puede ser una propiedad o un método. ¿Estás seguro de haber declarado la propiedad con privilegios de "lectura"? – vfn

Cuestiones relacionadas