2009-01-08 20 views
17

Tengo problemas para entender cuándo usar las propiedades en Objective C 2.0. Parece que no necesita una propiedad para un tipo primitivo como: int, bool, float. ¿Es esto cierto? He visto ejemplos que muestran propiedades para estos tipos y otros que los excluyen. Por ejemplo, en el código de ejemplo de Apple tienen:Uso de propiedades para tipos primitivos

... 
@interface Book : NSObject { 
    // Primary key in the database. 
    NSInteger primaryKey; 
    // Attributes. 
    NSString *title; 
    NSDate *copyright; 
    NSString *author; 

    BOOL hydrated; 
    BOOL dirty; 
    NSData *data; 
} 

@property (assign, nonatomic, readonly) NSInteger primaryKey; 
// The remaining attributes are copied rather than retained because they are value objects. 
@property (copy, nonatomic) NSString *title; 
@property (copy, nonatomic) NSDate *copyright; 
@property (copy, nonatomic) NSString *author; 
... 

Apple SQLite Book List Sample Code

Así como se puede ver que no utilizan una propiedad de BOOL, pero el tratamiento que tiene una variable de instancia en todo el archivo de implementación, leyendo el valor y estableciendo el valor. Buscando en línea He encontrado tutoriales que sí usan propiedades para estos tipos, como: (indicador @property BOOL). ¿Alguien puede arrojar algo de luz sobre este tema para mí? Gracias.

Respuesta

34

Sí, debe declarar una propiedad para los tipos primitivos. La única diferencia real es que debe usar assign (que es el valor predeterminado, por lo que también puede omitirlo) en lugar de copiar o retener. No puedo hablar por el resto del ejemplo, pero probablemente esté accediendo directamente a la variable de instancia interna, o si se está accediendo desde otra clave de clase, la codificación de valor está generando un descriptor de acceso (que en realidad es una mala forma). Supongo que es el primero; si no necesito un acceso especial y la variable de instancia no se usa fuera de la clase, solo me referiré a ella directamente en lugar de declarar una propiedad. Algunas personas podrían argumentar en contra de eso, supongo, pero me parece un poco excesivo.

+0

Gracias Marc.Sí, estaba usando propiedades para casi todo y solo estaba revisando mis clases y asegurándome de que fuera correcto. Agregué el enlace al código de muestra de Apple al que me refiero en mi pregunta. Pero parece que lo están accediendo directamente (no a través de self.dirty) – Sean

+3

Sí, estoy de acuerdo, no necesito propiedades para primitivos si no es necesario. Si necesita acceder fuera de su clase, necesita una propiedad. – mk12

+1

Otro uso de las propiedades es simplificar la administración de la memoria. En dealloc, puede tener self.ivar1 = nil en lugar de [ivar1 versión]; ivar1 = nil; No es un gran cambio, pero sigue siendo un buen hábito que simplifica el código repetitivo de la gestión de la memoria. Los primitivos no necesitan esto, pero pensé en explicar dónde las propiedades son útiles después de tu comentario. – Luke

Cuestiones relacionadas