Pregunta

Estoy tratando de entender el propósito de la directiva synthesize con nombre de la propiedad de primer orden. Decir que tengo una interfaz definida de la siguiente manera:

@interface Dummy ... {
    UILabel *_dummyLabel;
}

@property (retain, nonatomic) UILabel *dummyLabel;

Y en el archivo de implementación, que tengo:

@synthesize dummyLabel = _dummyLabel;

Por lo que entiendo, "dummyLabel" es sólo un alias de la variable de instancia "_dummyLabel". ¿Hay alguna diferencia entre self._dummyLabel y self.dummyLabel?

¿Fue útil?

Solución

Sí. self._dummyLabel no está definido, sin embargo _dummyLabel no lo es.

La sintaxis con punto expande a invocaciones de métodos simples, así que no es específico de propiedades. Si usted tiene un método llamado -(id)someObject, por ejemplo, en el caso de object.someObject, será como si escribió [object someObject];.

self.dummyLabel  //works
self._dummyLabel //does not work
dummyLabel       //does not work
_dummyLabel      //works
[self dummyLabel];  //works
[self _dummyLabel]; //does not work

Otros consejos

Su comprensión es incorrecta. dummyLabel es el nombre de la propiedad, y es no un alias para la variable de instancia - la variable de instancia es solamente _dummyLabel llamada. Así se cumple lo siguiente para una instancia de Dummy llamada myObject:

  • [myObject dummyLabel] funciona
  • myObject.dummyLabel funciona
  • falla [myObject _dummyLabel]
  • falla myObject._dummyLabel
  • falla myObject->dummyLabel
  • myObject->_dummyLabel depende de la visibilidad de la Ivar (@public, @private, @protected)
  • [myObject valueForKey: @"dummyLabel"] funciona
  • [myObject valueForKey: @"_dummyLabel"] depende de la implementación de +accessInstanceVariablesDirectly (es decir, que funcionará en el caso por defecto donde los retornos +accessInstanceVariablesDirectly YES).
  

La ventaja de tener otro nombre   para el Ivar que para la propiedad es   que se puede ver fácilmente en el código   cuando se está accediendo a una u   otro - Andre K

No soy capaz de encontrar un botón de 'comentario', así que estoy teniendo que publicar como una 'respuesta'.

Sólo quería ampliar el comentario de Andre - conociendo cuando se utiliza las propiedades sintetizados frente a la variable de vainilla, ya sabes (especialmente en el caso de los emisores) cuando una variable está siendo retenido / copió / liberado automáticamente gracias a su buen colocador , vs siendo manipulado por la mano.

Por supuesto, si usted está haciendo las cosas bien, es probable que no necesita la ayuda de un regulador de retener / liberar objetos adecuadamente! Pero no puede haber otros escenarios donde también se refiere a sus Ivars como self.ivar en lugar de _ivar puede ser útil, por ejemplo, cuando usted esté usando fijadores personalizados / captadores en lugar de la falta de pago sintetizado. Tal vez cada vez que se modifica una propiedad, también desea almacenar a NSUserDefaults. Por lo que podría tener algo de código como este:

@interface SOUserSettings : NSObject {

BOOL _autoLoginOn;

}

@property (nonatomic, assign) BOOL autoLoginOn;

@end

@implementation SOUserSettings

@synthesize autoLoginOn = _autoLoginOn;

- (void)setAutoLoginOn:(BOOL)newAutoLoginOnValue {

   _autoLoginOn = newAutoLoginOnValue;
   [[NSUserDefaults standardUserDefaults] setBool:_autoLoginOn forKey:@"UserPrefAutoLoginOn"];
}

@end

Nota: Este código es sólo ilustrativa, podría haber un mal mil cosas con ella

Así que ahora, en su código, si usted tiene una línea que dice _autoLoginOn = YES -. Sabe que no va a ser guardado en NSUserDefaults, mientras que si se utiliza self.autoLoginOn = YES que sabe exactamente lo que va a pasar

La diferencia entre _autoLoginOn y self.autoLoginOn es más que semántica.

  

No veo ninguna gran ventaja de   cambio de nombre _dummyLabel a dummyLabel

En algunos ObjC tiempos de ejecución tiene un disco variables de instancia de toma tiempo invisibles para los usuarios de la clase. Para que se peguen algún prefijo (o sufijo) en sus variables de instancia se puede dejar en claro (o más clara) que usted no quiere ensuciar cualquier persona con sus variables. Sin embargo usted no quiere que la mugre de sus funciones públicas. Esto le permite bajar de él.

También podría ser útil si se necesita para mantener una interfaz de edad con una serie de nombres, al mismo tiempo que un nuevo conjunto de APIs con un nuevo conjunto de nombres (setLastname vs setSurname).

Mensaje viejo, pero creo que es importante mencionar, que se recomienda a las variables de acceso a través de captadores y definidores (así, con la notación de puntos). Acceder a un campo directamente (_ivar) es muy recomendable sólo cuando inicializarlo.

Hay un buen artículo de Apple: https://developer.apple.com/ biblioteca / ios / # documentación / cacao / conceptual / ProgrammingWithObjectiveC / EncapsulatingData / EncapsulatingData.html

El último párrafo:

  

Siempre debe tener acceso a las variables de instancia directamente desde dentro   un método de inicialización porque en el momento de una propiedad se establece, el   resto del objeto no puede sin embargo ser completamente inicializado. Incluso si tú   no proporcionan métodos de acceso personalizada o sabe de cualquier efecto secundario de   dentro de su propia clase, subclase un futuro muy bien puede anular el   comportamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top