Widziałem następujący fragment kodu:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Jaka jest zależność między mapView
i mapView1
? Czy tworzy metodę set
i get
dla mapView1
?
iphone
objective-c
Hoang Duy Nam
źródło
źródło
Odpowiedzi:
W naszym przykładzie
mapView1
jest to zmienna instancji (ivar), część pamięci należąca do instancji klasy zdefiniowanej wexample.h
iexample.m
.mapView
to nazwa własności . Właściwości są atrybutami obiektu, który można odczytać lub ustawić za pomocą notacji kropki:myObject.mapView
. Nieruchomość nie musi opierać się na ivar, ale większość nieruchomości tak.@property
Deklaracja po prostu mówi światu, że istnieje własność nazywamapView
.@synthesize mapView = mapView1;
Ta linia mówi kompilatorowi, aby utworzył metodę ustawiającą i pobierającą dla
mapView
oraz że powinien użyć wywoływanego ivarmapView1
. Bez= mapView1
części kompilator założyłby, że właściwość i ivar mają tę samą nazwę. (W tym przypadku spowodowałoby to błąd kompilatora, ponieważ nie jest wywoływana żadna funkcja ivarmapView
).Wynik tego
@synthesize
stwierdzenia jest podobny do tego, gdy sam dodałeś ten kod:Jeśli sam dodasz ten kod do klasy, możesz zamienić
@synthesize
instrukcję na@dynamic mapView;
Najważniejsze jest, aby mieć bardzo jasne koncepcyjne rozróżnienie między bluszczami a nieruchomościami. To naprawdę dwie bardzo różne koncepcje.
źródło
@synthesize
tworzy metodę pobierającą i ustawiającą dla zmiennej.Pozwala to określić pewne atrybuty dla zmiennych, a kiedy przypisujesz
@synthesize
tę właściwość zmiennej, generujesz metodę pobierającą i ustawiającą dla zmiennej.Nazwa właściwości może być taka sama jak nazwa zmiennej. Czasami ludzie chcą, aby był inny, aby używać go w
init
lubdealloc
lub gdy parametr jest przekazywany z tą samą nazwą zmiennej.źródło
Z dokumentacji :
źródło
Ponieważ właśnie napotykam ten problem podczas edytowania starszego kodu, chcę zrobić dodatkowe notatki do istniejących odpowiedzi, o których należy wiedzieć.
Nawet w przypadku nowszej wersji kompilatora czasami ma znaczenie, czy pominiesz,
@synthesize propertyName
czy nie .W przypadku, gdy deklarujesz zmienną instancji bez podkreślenia, a jednocześnie ją syntetyzujesz, na przykład:
Nagłówek:
Realizacja:
self.someInt
będzie mieć dostęp do tej samej zmiennej cosomeInt
. Brak wiodącego podkreślenia dla ivars nie jest zgodny z konwencją nazewnictwa, ale po prostu znalazłem się w sytuacji, w której musiałem odczytać i zmodyfikować taki kod.Ale jeśli teraz myślisz „Hej, @synthesize nie jest już ważne, ponieważ używamy nowszego kompilatora” , mylisz się! Twoja klasa będzie wtedy mieć dwa ivary , a mianowicie
someInt
plus_someInt
zmienną generowaną automatycznie . W ten sposóbself.someInt
isomeInt
nie będzie już adresować tych samych zmiennych. Jeśli nie spodziewasz się takiego zachowania, jak ja, może to przyprawić Cię o ból głowy.źródło
@synchronize
to dyrektywa określająca sposób synchronizowania wątków podczas uzyskiwania dostępu do właściwości i@synthesize
służy do wiązania właściwości ze zmienną instancji za pomocą metod pobierających i ustawiających.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
. (Nie wiem, w której wersji xcode to ostrzeżenie zostało dodane.)Zgodnie z dokumentacją firmy Apple @Synthesize służy tylko do zmiany nazw zmiennych instancji. Na przykład
Teraz w klasie, której nie możesz użyć,
_str
ponieważ powyższa linia zmienia nazwę zmiennej instancji nastr2
@property
zezwala na używanie obiektów przez obiekty z innych klas, czyli innymi słowy upublicznia obiekt.źródło
Podczas tworzenia właściwości w @interface, właściwość ta zostanie automatycznie zwrócona przez zmienną wystąpienia o nazwie _propertyName. Więc kiedy tworzysz właściwość o nazwie firstName, za sceną kompilator domyślnie utworzy zmienną instancji o nazwie _firstName. Kompilator utworzy również dla Ciebie metodę pobierającą i ustawiającą (np. FirstName, setFirstName).
Teraz, gdy syntetyzujesz właściwość za pomocą @synthesize firstName, po prostu mówisz kompilatorowi o zmianie nazwy zmiennej instancji (_firstName) na firstName. Jeśli chcesz zmienić nazwę zmiennej instancji kopii zapasowej na inną nazwę, możesz po prostu przypisać inną nazwę podczas syntezy nazwy właściwości (np. @Synthesize firstName = myFirstName), wykonując to, twoja właściwość jest zabezpieczona przez zmienną instancji o nazwie myFirstname.
Krótko mówiąc, przez większość czasu @synthesize służyło do zmiany nazwy zmiennej instancji, której kopia zapasowa jest tworzona przez twoją właściwość.
źródło
Zobacz dokumentację Apple
Zasadniczo synthesize tworzy metody setMapView i mapView, które ustawiają i pobierają mapView1
źródło
Tworzy getter i setter dla twojego obiektu. Możesz uzyskać dostęp za pomocą czegoś takiego:
lub
mapView1 to nazwa ivar w klasie, mapView to nazwa metody (metod) pobierającej / ustawiającej.
źródło