auto.variable variable y variable

Cuál es la diferencia entre self.myVariable = obj; y myVariable = obj; , cuando uso @propery / @synthesize para crear `myVariable?

Es importante tener en cuenta que la syntax de punto se convierte en una simple llamada objc_msgSend por el comstackdor: es decir, que debajo de ella actúa exactamente como un mensaje enviado al descriptor de acceso de esa variable. Como tal, los tres de los siguientes son equivalentes:

 self.myVariable = obj; [self setMyVariable:obj]; objc_msgSend(self, @selector(setMyVariable:), obj); 

Por supuesto, esto significa que el uso de syntax de puntos en realidad da como resultado un envío completo de mensajes, lo que significa que se llama a una nueva función y a todos los gastos generales asociados. Por el contrario, el uso de asignación simple (myVariable = obj;) no genera ninguna sobrecarga, pero, por supuesto, solo se puede utilizar dentro de los métodos de instancia de la clase en cuestión.

La directiva @synthesize le dice al comstackdor que genere accesos para sus variables miembro, de acuerdo con las especificaciones dadas en la directiva @property en su archivo .h. (Es decir, si especifica retener, el colocador retendrá la variable, y si especifica la copia, la copiará).

Los accesadores (a menos que especifique lo contrario) se denominarán propertyName y setPropertyName.

Utilizando el . la notación (tenga en cuenta, no la syntax propia como se indicó anteriormente) está diciendo que desea utilizar los accesadores (algo bueno si está configurando cadenas, y quiere asegurarse de que el conteo retenido sea correcto, por ejemplo).

Entonces, dentro de su implementación de clase:

  • self.bill = fred llamará al descriptor de acceso setBill.
  • bill = fred configurará bill para fred directamente, sin pasar por el acceso.

Una de las diferencias que descubrí al iniciar el desarrollo de Cocoa es si configuro la variable para usar una syntax @ Property / @ Synthesize y no usé self.myVariable = obj o [self setMyVariable: obj] sino que en cambio myVariable = obj , el objeto no se conserva si obj se libera más tarde. (Asumiendo @Property fue configurado para usar retener)

El motivo es que el recuento de retención no se establece cuando se utiliza myVariable = obj y cuando se lanza el obj, el recuento ahora es cero. (A menos que lo retenga usted mismo) Pero al usar el acceso, hará el conteo retenido por usted. (Suponiendo nuevamente que lo configures para usar retener cuando se declaró).

Shyne

Si puedo agregar una nota importante a esto. La respuesta anterior es increíble, por lo que no añadiré nada al aspecto técnico. Pero solo esto:

Si crea una propiedad sintetizada

 @synthesize myProp; 

Siempre use el patrón self.myProp para configurarlo.

 self.myProp = newVal; 

Esto parece muy obvio, pero es importante. Es cierto que simplemente no hay razón para hacer esto, pero hasta que realmente comprenda cómo se crean los setters sintetizados, solo quiere asumir que TIENE que usar el self. patrón para establecer el valor.

Honesto: esto te ahorrará muchas sesiones de depuración a altas horas de la noche. Las violaciones de acceso a memoria no retenidas son simplemente las peores para depurar.

La syntax self utiliza el método de acceso, la otra syntax no. Esto podría ser una gran diferencia si el descriptor de acceso hace algo más que simplemente asignar el nuevo valor. Ver la parte de propiedades declaradas del tutorial de Objective-C.

Las otras respuestas son correctas, la diferencia es que la notación de punto hace que el ivar cambie a través del accesorio en lugar de hacerlo directamente.

Hasta que sepa lo que está haciendo, le recomiendo que use la notación de puntos (es decir, self.propertyName = ... ). Cocoa / Obj-C hace mucho con la encoding de clave-valor, y aunque el SDK del teléfono no aprovecha al máximo (con cosas como enlaces), eventualmente lo hará. Acostumbrarse a usar los accesorios ahora le ahorrará muchos dolores de cabeza en el futuro.

El uso de los métodos de acceso también le da la oportunidad de anularlos y proporcionar más funciones si lo necesita. Simplemente cambiando el valor del ivar, te despojas de esta capacidad.