2012-02-05 10 views
6

Tengo una pregunta sobre el uso de captadores y variables de instancia. Veamos un ejemplo.iOS cuando utilizo la variable de instancia o el método getter

Supongamos que tengo en un archivo .h:

@property (nonatomic,strong) NSString *name 

y en el archivo .m sintetizo esa variable de esta manera:

@synthesize name = _name; 

Ahora mi pregunta es: ¿cuál es la diferencia entre utilizar:

[self.name aMethod] 

y

[_name aMethod] 

Gracias!

Respuesta

8

El primero accede al ivar mediante el método getter. El segundo accede directamente al ivar. Dado que es una propiedad simple y sintetizada, no hay mucha diferencia, excepto que la primera hace una llamada a un método adicional. Sin embargo, si la propiedad fuera atómica o dinámica, o si el método getter fuera complicado, habría una diferencia en que el primero sería atómico en realidad, mientras que el segundo no lo haría y el primero realmente desencadenaría una lógica complicada en el getter mientras que el segundo no.

En términos más simples, el compilador re-escribe la primera llamada a:

[[self name] aMethod] 

mientras que la segunda llamada se deja simplemente como está.

1
[self.name aMethod] 

es equivalente a

[[self name] aMethod] 

Así, un getter se llama y el mensaje se envía a su resultado.

En su caso, el resultado visible será el mismo.

Sin embargo, puede no ser un caso si getter no fue trivial (es decir, sintetizado).

0

Las primeras llamadas a través del captador: es igual a [[self name] aMethod]. El segundo solo usa acceso directo.

En general, debería estar a favor de usar los accesorios, pero hay veces en que debe desviarse de eso. la ocurrencia más común es mientras está en estados parcialmente construidos, como su inicializador y dealloc. la razón es que debe construir o destruir cuidadosamente su estado y no le interesa la semántica de la interfaz de su objeto, es decir, usar los accesores puede tener efectos secundarios semánticos y de comportamiento negativos.

Una lista más completa de las razones se puede encontrar aquí: Why would you use an ivar?

Cuestiones relacionadas