self.myString = @"test";
jest dokładnie równoważne pisaniu [self setMyString:@"test"];
. Oba wywołują metodę.
Mogłeś sam napisać tę metodę. Może to wyglądać mniej więcej tak:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
Ponieważ stosowane @synthesize
, nie trzeba faktycznie przeszkadzało pisząc tę metodę, można po prostu pozwolić kompilator do napisania go dla Ciebie.
Tak więc, patrząc na tę metodę, wygląda na to, że wywołanie spowoduje to samo, co właśnie przypisanie wartości zmiennej instancji, prawda? Cóż, to nie takie proste.
Po pierwsze, możesz napisać własną metodę setera. Jeśli to zrobisz, twoja metoda zostanie wywołana i może zrobić wiele dodatkowych rzeczy, jak również ustawić zmienną. W takim przypadku użycie metody self.myString =
wywoła tę metodę, ale wykonanie _myString =
nie będzie, a zatem będzie używana inna funkcja.
Po drugie, jeśli kiedykolwiek użyjesz Key Value Observing, kompilator zrobi bardzo sprytne sztuczki. Za kulisami podklasuje twoją klasę i nadpisuje twoją metodę ustawiającą (czy to tą, którą sam napisałeś, czy wygenerowaną przez syntezę), aby wykonać połączenia do willChangeValueForKey:
, które są potrzebne, aby Key Value Observing działało. Nie musisz wiedzieć, jak to działa (chociaż jest to całkiem interesujące, jeśli chcesz trochę czytać na dobranoc!), Ale musisz wiedzieć, że jeśli chcesz, aby Key Value Observing działało automatycznie, musisz użyć metod setera.
Po trzecie, wywołanie metody ustawiającej, nawet jeśli polegasz na syntezatorze, aby pisać, daje elastyczność na przyszłość. Możesz chcieć zrobić coś ekstra za każdym razem, gdy wartość zostanie zmieniona iw punkcie, w którym odkryjesz, że chcesz to zrobić, możesz ręcznie napisać metodę ustawiającą - jeśli masz zwyczaj używania zawsze self.myString =
, to nie będziesz musisz zmienić resztę kodu, aby rozpocząć wywoływanie nowej metody!
Po czwarte, to samo dotyczy podklas. Jeśli ktoś inny miałby podklasować twój kod, jeśli użyjesz setterów, mogliby je przesłonić, by dostosować funkcjonalność.
Za każdym razem, gdy bezpośrednio uzyskujesz dostęp do zmiennej instancji, jawnie nie zapewniasz sposobu na dołączenie dodatkowej funkcjonalności w tym momencie. Ponieważ Ty lub ktoś inny może chcieć skorzystać z takiej funkcjonalności w przyszłości, opłaca się korzystać z ustawiaczy przez cały czas, chyba że jest ku temu dobry powód.
'self' jest symbolem. '_' jest znakiem w niektórych symbolach. 'myString' i' _myString' to dwa różne symbole, które są powiązane, nie z powodu pisowni, ale dlatego, że są one nazwane w tym samym '@ synthezize'. –
Spróbuj następującą odpowiedź: http://stackoverflow.com/questions/5170631/what-does-synthesize-window-window-do – Peres
Sprawdź, czy @ odpowiedź Jonathana do tego poprzedni SO pytanie pomaga http: // stackoverflow .com/questions/5466496/dlaczego -nazwane-syntezowane-właściwości-in-ios-z wiodącymi-podkreśleniami – visakh7