self.myString = @"test";
es exactamente equivalente a escribir [self setMyString:@"test"];
. Ambos están llamando a un método.
Podría haber escrito ese método usted mismo. Podría ser algo como esto:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
Como se utilizó @synthesize
, usted no tiene que molestarse en realidad escribir ese método, sólo puede permitir que el compilador para escribir por ti.
Por lo tanto, al mirar ese método, parece que llamar hará exactamente lo mismo que asignar un valor a la variable de instancia, ¿verdad? Bueno, no es tan simple.
En primer lugar, podría escribir su propio método setter. Si lo hace, se llamará a su método, y podría hacer todo tipo de cosas adicionales, así como establecer la variable. En ese caso, usar self.myString =
llamaría a su método, pero al hacer _myString =
no lo haría, y por lo tanto se utilizarían diferentes funcionalidades.
En segundo lugar, si alguna vez utiliza Key Value Observing, el compilador hace algunos trucos muy inteligentes. Detrás de escena, subclasifica tu clase y anula tu método setter (ya sea uno que escribiste tú mismo o uno generado por sintetizar), para hacer las llamadas al willChangeValueForKey:
que se necesitan para que Key Value Observing funcione. No es necesario que sepa cómo funciona esto (¡aunque es bastante interesante si desea leer algo antes de acostarse!), Pero necesita saber que si desea que Key Value Observing funcione de manera automática, debe usar métodos setter.
En tercer lugar, llamar al método setter incluso si confía en sintetizar para escribir uno le da flexibilidad para el futuro. Es posible que desee hacer algo extra siempre que se modifique un valor, y en el momento en que descubra que desea hacerlo, puede escribir manualmente un método setter; si tiene la costumbre de usar siempre self.myString =
, no lo hará ¡necesita cambiar el resto de su código para comenzar a llamar al nuevo método!
En cuarto lugar, lo mismo se aplica a las subclases. Si alguien más fuera a subclasificar tu código, si usas los setters entonces podrían anularlos para ajustar la funcionalidad.
Cada vez que accede directamente a la variable de instancia, explícitamente no proporciona una forma de que la funcionalidad adicional se enganche en ese punto. Dado que usted u otra persona podría querer conectar esa funcionalidad en el futuro, vale la pena utilizar los setters todo el tiempo, a menos que haya una buena razón para no hacerlo.
'self' es un símbolo. '_' es un personaje en algunos símbolos. 'myString' y' _myString' son dos símbolos diferentes que están relacionados, no por la ortografía, sino porque están nombrados en el mismo '@ synthezize'. –
Prueba la siguiente respuesta: http://stackoverflow.com/questions/5170631/what-does-synthesize-window-window-do – Peres
@ Compruebe si la respuesta de Jonathan a esta pregunta anterior SO ayuda http: // stackoverflow .com/questions/5466496/why-rename-synthesized-properties-in-ios-with-leading-underscores – visakh7