Pregunta ¿Hay alguna diferencia entre una "variable de instancia" y una "propiedad" en Objective-c?


¿Hay alguna diferencia entre una "variable de instancia" y una "propiedad" en Objective-c?

No estoy muy seguro de esto. Creo que una "propiedad" es una variable de instancia que tiene métodos de acceso, pero podría pensar que está mal.


76
2018-05-09 16:53


origen


Respuestas:


Una propiedad es un concepto más abstracto. Una variable de instancia es literalmente solo un espacio de almacenamiento, como un espacio en una estructura. Normalmente, se supone que otros objetos nunca deben acceder a ellos directamente. Una propiedad, por otro lado, es un atributo de su objeto al que se puede acceder (suena vago y se supone que debe). Por lo general, una propiedad devolverá o establecerá una variable de instancia, pero podría usar datos de varios o ninguno. Por ejemplo:

@interface Person : NSObject {
    NSString *name;
}

    @property(copy) NSString *name;
    @property(copy) NSString *firstName;
    @property(copy) NSString *lastName;
@end

@implementation Person
    @synthesize name;

    - (NSString *)firstName {
        [[name componentsSeparatedByString:@" "] objectAtIndex:0];
    }
    - (NSString *)lastName {
        [[name componentsSeparatedByString:@" "] lastObject];
    }
    - (NSString *)setFirstName:(NSString *)newName {
        NSArray *nameArray = [name componentsSeparatedByString:@" "];
        NSArray *newNameArray [[NSArray arrayWithObjects:newName, nil] arrayByAddingObjectsFromArray:[nameArray subarrayWithRange:NSMakeRange(1, [nameArray size]-1)]];
        self.name = [newNameArray componentsJoinedByString:@" "];
    }
    - (NSString *)setLastName:(NSString *)newName {
        NSArray *nameArray = [name componentsSeparatedByString:@" "];
        NSArray *newNameArray [[nameArray subarrayWithRange:NSMakeRange(0, [nameArray size]-2)] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:newName, nil]];
        self.name = [newNameArray componentsJoinedByString:@" "];
    }
@end

(Nota: el código anterior tiene errores ya que supone que el nombre ya existe y tiene al menos dos componentes (por ejemplo, "Bill Gates" en lugar de solo "Gates"). Sentí que corregir esos supuestos sería el verdadero punto del código menos claro, así que solo lo estoy señalando aquí, así que nadie repite inocentemente esos errores).


81
2018-05-09 17:29



Una propiedad es una forma amigable de implementar un getter / setter por algún valor, con características adicionales útiles y sintaxis. Una propiedad puede respaldarse con una variable de instancia, pero también puede definir el getter / setter para hacer algo un poco más dinámico, p. Ej. usted puede definir una propiedad de caja inferior en una cadena que crea dinámicamente el resultado en lugar de devolver el valor de alguna variable miembro.

Aquí hay un ejemplo:

// === In your .h ===

@interface MyObject {
    NSString *propertyName;

}

// ...

@property (nonatomic, retain) NSString *propertyName;

// === In your .m @implementation ===

@synthesize propertyName /* = otherVarName */;

los @property línea define una propiedad llamada propertyName de tipo NSString *. Esto se puede obtener / configurar usando la siguiente sintaxis:

myObject.propertyName = @"Hello World!";
NSLog("Value: %@", myObject.propertyName);

Cuando asigna o lee desde myObject.propertyName realmente está llamando métodos setter / getter en el objeto.

los @synthesize line le dice al compilador que genere estos getter / setters por usted, usando la variable miembro con el mismo nombre de la propiedad para almacenar el valor (o otherVarName si usas la sintaxis en los comentarios).

Junto con @synthesize aún puede anular uno de los getter / setters definiendo el suyo. La convención de nomenclatura para estos métodos es setPropertyName: para el colocador y propertyName (o getPropertyName, no estándar) para el getter. El otro se generará para usted.

En tus @property Puede definir una serie de atributos en parens para la propiedad que puede automatizar cosas como seguridad de subprocesos y administración de memoria. Por defecto, una propiedad es atómica, lo que significa que el compilador se ajustará @synthesized obtener / configurar llamadas con bloqueos apropiados para evitar problemas de concurrencia. Puedes especificar el nonatomic atributo para deshabilitar esto (por ejemplo, en el iPhone al que desea predeterminar la mayoría de las propiedades nonatomic)

Hay 3 valores de atributo que controlan la gestión de memoria para cualquier @synthesized Setters. El primero es retain que enviará automáticamente release a los valores antiguos de la propiedad, y retain a los nuevos valores Esto es muy útil

El segundo es copy que hará una copia de cualquier valor pasado en lugar de retenerlos. Es una buena práctica usar copypara NSString porque una persona que llama podría pasar un NSMutableString y cambiarlo por debajo de usted. copy hará una nueva copia de la entrada a la que solo usted tiene acceso.

El tercero es assign que asigna un puntero recto sin invocar retención / liberación en el objeto viejo o nuevo.

Por último, también puedes usar readonly atributo para desactivar el establecimiento de la propiedad.


30
2018-05-09 17:53



Utilizo propiedades para la parte de la interfaz, donde el objeto interactúa con otros objetos y las variables de instancia son cosas que necesitas dentro de tu clase, nadie más que tú debe verlas y manipularlas.


6
2018-06-15 13:54



De forma predeterminada, una propiedad de lectura respaldará una variable de instancia, que el compilador sintetizará de nuevo automáticamente.

Una variable de instancia es una variable que existe y mantiene su valor durante la vida del objeto. La memoria utilizada para las variables de instancia se asigna cuando el objeto se crea por primera vez (a través de alloc) y se libera cuando el objeto se desasigna.

A menos que especifique lo contrario, la variable de instancia sintetizada tiene el mismo nombre que la propiedad, pero con un prefijo de subrayado. Para una propiedad llamada firstName, por ejemplo, la variable de instancia sintetizada se llamará _firstName.


3
2018-05-28 11:13



Anteriormente las personas usaban propiedades públicamente y ivars para uso privado, pero desde hace varios años, también pueden definir propiedades en @implementation para usarlos en privado Pero todavía usaría ivars cuando sea posible, ya que hay menos letras para escribir, y se ejecuta más rápido de acuerdo con Este artículo. Tiene sentido, ya que las propiedades tienen la intención de ser "pesadas": se supone que se accede desde los captadores / definidores generados o los escritos manualmente.

Sin embargo, en los códigos recientes de Apple, ya no se usan ivars. Supongo que porque es más como objc más bien que C/C++Además, es más fácil usar propiedades con assign, nullable, etc.


1
2018-06-07 13:15