Jakie są różnice między wdrożenie @property
z @dynamic
lub @synthesize
?
559
Jakie są różnice między wdrożenie @property
z @dynamic
lub @synthesize
?
@synthesize wygeneruje metody pobierające i ustawiające dla Twojej właściwości. @dynamic po prostu mówi kompilatorowi, że metody pobierające i ustawiające są implementowane nie przez samą klasę, ale gdzie indziej (np. nadklasę lub zostaną udostępnione w czasie wykonywania).
Zastosowania @dynamic są np. Z podklasami NSManagedObject
(CoreData) lub gdy chcesz utworzyć ujście dla właściwości zdefiniowanej przez nadklasę, która nie została zdefiniowana jako ujście.
@dynamic można również wykorzystać do przekazania odpowiedzialności za implementację akcesoriów. Jeśli implementujesz akcesoria samodzielnie w klasie, zwykle nie używasz @dynamic.
Super klasa:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
Podklasa:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
NSUnknownKeyException
Podczas usuwania@synthesize
linii pojawiały się błędy w mojej właściwości dynamicznej (Xcode 3.2 dawał mi błąd b / c, że nie miałem pasującego ivar dla mojej @property). Dodanie@dynamic
naprawiło problem - teraz kompiluje się i działa poprawnie. Dzięki!@property
przedmioty, które nie mają ani@synthesize
nie@dynamic
będą automatycznie syntezowane. Dla każdej właściwości zostanie utworzony ivar z wiodącym podkreśleniem, np._propertyName
Wraz z odpowiednim narzędziem pobierającym i ustawiającym.Spójrz na ten artykuł ; w tytule „Metody udostępniane w czasie wykonywania”:
Z
@synthesize
drugiej strony dyrektywa generuje dla ciebie metody akcesora w czasie kompilacji (chociaż, jak zauważono w sekcji „Miksowanie syntetycznych i niestandardowych akcesoriów”, jest elastyczna i nie generuje metod, jeśli którekolwiek są zaimplementowane).źródło
Jak powiedzieli inni, zazwyczaj używasz @synthesize, aby kompilator wygenerował dla ciebie gettery i / lub ustawienia, a @dynamic, jeśli masz zamiar je napisać.
Jest jeszcze inny subtelność jeszcze wymienić: @synthesize będzie pozwalają zapewnić implementację siebie, albo z getter i setter. Jest to przydatne, jeśli chcesz zaimplementować moduł pobierający tylko w celu uzyskania dodatkowej logiki, ale pozwól kompilatorowi wygenerować moduł ustawiający (który dla obiektów jest zwykle nieco trudniejszy do napisania).
Jednak jeśli napiszesz implementację dla akcesorium @ syntezowanego, to musi ona być jeszcze poparta prawdziwym polem (np. Jeśli piszesz
-(int) getFoo();
, musisz miećint foo;
pole). Jeśli wartość jest wytwarzana przez coś innego (np. Obliczana z innych pól), musisz użyć @dynamic.źródło
@dynamic
jeśli zamierzasz je napisać sam” NIE, nie używasz dynamiki, jeśli sam je piszesz.@dynamic
wyłącza sprawdzanie kompilatora, aby upewnić się, że zostały zaimplementowane. Jeśli sam je zaimplementowałeś, chcesz, aby kompilator sprawdził.@dynamic jest zwykle używany (jak wspomniano powyżej), gdy właściwość jest dynamicznie tworzona w czasie wykonywania. NSManagedObject robi to (dlaczego wszystkie jego właściwości są dynamiczne) - co eliminuje niektóre ostrzeżenia kompilatora.
Dobry przegląd dynamicznego tworzenia właściwości (bez NSManagedObject i CoreData :, patrz: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#// apple_ref / doc / uid / TP40008048-CH102-SW1
źródło
oto przykład @dynamic
źródło
Zgodnie z dokumentacją:
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html
@dynamic informuje kompilator, że metody dostępu są udostępniane w czasie wykonywania.
Po krótkim dochodzeniu dowiedziałem się, że udostępnienie metod akcesorium zastępuje dyrektywę @dynamic.
@synthesize mówi kompilatorowi, aby utworzył dla ciebie te akcesoria (getter i setter)
@property informuje kompilator, że akcesory zostaną utworzone i że można uzyskać do nich dostęp za pomocą notacji kropkowej lub [komunikatu obiektowego]
źródło
Jedną rzeczą, którą chcę dodać, jest to, że jeśli właściwość zostanie zadeklarowana jako @dynamic, nie zajmie ona pamięci (potwierdziłem za pomocą instrumentu alokacji). Konsekwencją jest to, że możesz zadeklarować właściwość w kategorii klasy.
źródło
Zgodnie z dokumentacją Apple.
Używasz
@synthesize
instrukcji w bloku implementacyjnym klasy, aby powiedzieć kompilatorowi, aby utworzył implementacje pasujące do specyfikacji podanej w@property
deklaracji.@dynamic
Instrukcja służy do informowania kompilatora, aby pomijał ostrzeżenie, jeśli nie może znaleźć implementacji metod dostępu określonych w@property
deklaracji.Więcej informacji:-
https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html
źródło