2009-10-05 14 views
6

Si tengo una clase con algunos IBOutlets, parece un poco tonto crear accesos para estos.¿Debo usar siempre descriptores de acceso para variables de ejemplo en Objective-C?

Pero luego siento que estoy rompiendo las prácticas de OO al no revisar los elementos de acceso por ejemplo.

También me siento de la misma manera con algunas variables de instancia que no deberían ser públicas, prefiero no exponer el funcionamiento interno de algunas clases. Puedo hacer que los ivars reales sean privados, pero la taquigrafía @property no parece poder especificar la visibilidad. Esto me lleva a no crear accesos y solo acceder a los ivars directamente. No estoy seguro de si esto está mal visto sin embargo. ¿Lo es?

¿Cuál es la opinión de la comunidad sobre esta pregunta abiertamente novato? (Por favor, ignore la sintaxis de punto)

Respuesta

4

No estoy seguro acerca de cómo acceder directamente a las variables de instancia, creo que no, pero para algunas variables simplemente no tiene sentido usar accesadores. Como para el IBOutlet que mencionaste.

Solo puedo ayudarte con los accesorios privados. Comenzando con Objective-C 2.0 puede declare extensions.

extensiones de clase son como “anónimos” categorías, excepto que los métodos declaran debe ser implementado en el principal @implementation bloque para la clase correspondiente .

Simplemente ponga esta extensión en un archivo de encabezado separado y tendrá accesodores privados que no están visibles en el encabezado.

3

público/privado

Se puede declarar sus Ivars como en el archivo @interface a ser de sólo lectura, pero luego volver a declarar en una categoría para que su clase puede cambiarlos. Aquí hay un quick intro to Categories.

Un ejemplo:

//MyClass.h 

@interface MyClass : NSObject { 
    NSString *name; 
} 
@property (readonly) NSString *name; 

@end 

Y en el archivo de implementación puede redeclare esto:

//MyClass.m 
@interface MyClass() //declare the class extension 

@property (readwrite, copy) NSString *name; //redeclare the property 

@end 

@implementation MyClass 

@synthesize name; 

@end 

Ahora, la propiedad name es de sólo lectura externo a la clase, pero se puede cambiar por la clase a través de sintaxis de propiedad o sintaxis setter/getter.

Ivars

realmente privadas

Si desea mantener Ivars muy privado y sólo acceder a ellos directamente sin pasar por la sintaxis @property se pueden declarar con la palabra clave @private. Pero luego dices "Ah, pero siempre pueden obtener el valor fuera de la clase usando métodos KVC como setValueForKey:" En ese caso, echa un vistazo al método de clase de protocolo NSKeyValueCoding + (BOOL)accessInstanceVariablesDirectly que detiene esto.

IBOutlets como propiedades

La forma recommended es utilizar @property y @synthesize.Para Mac OS X, puede declararlos como propiedades de solo lectura. Por ejemplo:

//MyClass.h 

@interface MyClass : NSObject { 
    NSView *myView; 
} 
@property (readonly) IBOutlet NSView *myView; 

@end 

//MyClass.m 

@implementation MyClass 

@synthesize myView; 

@end 
Cuestiones relacionadas