@synthesize vs @ dynamic, jakie są różnice?

Jakie są różnice między implementacją a @property z @dynamic lub @synthesize?

Author: Wayne Chen, 2009-07-21

8 answers

@ synthesize wygeneruje metody getter i setter dla Twojej właściwości. @dynamic po prostu mówi kompilatorowi, że metody getter i setter są zaimplementowane nie przez samą klasę, ale gdzie indziej (jak Klasa superclass lub będą dostarczane w czasie wykonywania).

Zastosowania dla @dynamic są np. z podklasami NSManagedObject (CoreData) lub gdy chcesz utworzyć outlet dla właściwości zdefiniowanej przez superklasę, która nie została zdefiniowana jako outlet.

@dynamic może być również używany do delegowania odpowiedzialność za wdrożenie accessories. Jeśli zaimplementujesz accessory samodzielnie w ramach klasy, to normalnie nie używasz @ dynamic.

Super klasa:

@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;

Podklasa:

@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
 719
Author: diederikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-07 19:01:25

Spójrz na Ten artykuł ; pod nagłówkiem "metody dostarczane w czasie wykonywania":

Niektóre Accesory są tworzone dynamicznie w czasie wykonywania, jak na przykład niektóre używane w klasie Nsmanagedobject CoreData. Jeśli chcesz zadeklarować i użyć właściwości dla tych przypadków, ale chcesz uniknąć ostrzeżeń o braku metod podczas kompilacji, możesz użyć dyrektywy @ dynamic zamiast @synthesize.

...

Użycie dyrektywy @ dynamic zasadniczo mówi kompilator "nie martw się, metoda jest w drodze."

Dyrektywa @synthesize generuje metody accessora dla Ciebie w czasie kompilacji (chociaż jak wspomniano w sekcji "mieszanie syntezowanych i niestandardowych Accesorów" jest elastyczna i nie generuje metod dla Ciebie, jeśli któreś z nich są zaimplementowane).

 209
Author: Alex Rozanski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 17:20:06

Jak mówili inni, ogólnie używasz @synthesize, aby kompilator generował gettery i / lub ustawienia dla Ciebie, a @dynamic, jeśli chcesz je napisać samodzielnie.

Jest jeszcze jedna subtelność, o której jeszcze nie wspomniano: @synthesize will pozwoli Ci samodzielnie dostarczyć implementację gettera lub settera. Jest to przydatne, jeśli chcesz zaimplementować getter tylko dla dodatkowej logiki, ale pozwól kompilatorowi wygenerować setter (który dla obiektów jest zwykle nieco bardziej skomplikowane do napisania samemu).

Jeśli jednak napiszesz implementację dla accesora @ synthesized musi ona być nadal wspierana przez prawdziwe pole (np. jeśli napiszesz -(int) getFoo(); musisz mieć pole int foo;). Jeśli wartość jest wytwarzana przez coś innego (np. obliczana z innych pól), musisz użyć @dynamic.

 29
Author: philsquared,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 18:04:50

@dynamic jest zwykle używany (jak zostało powiedziane 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 tłumi niektóre ostrzeżenia kompilatora.

Aby uzyskać dobry przegląd jak dynamicznie tworzyć właściwości (bez NSManagedObject i CoreData:, zobacz: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//apple_ref/doc/uid/TP40008048-CH102-SW1

 14
Author: mifortin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-25 21:30:09

Oto Przykład @ dynamic

#import <Foundation/Foundation.h>

@interface Book : NSObject
{
   NSMutableDictionary *data;
}
@property (retain) NSString *title;
@property (retain) NSString *author;
@end

@implementation Book
@dynamic title, author;

- (id)init
{
    if ((self = [super init])) {
        data = [[NSMutableDictionary alloc] init];
        [data setObject:@"Tom Sawyer" forKey:@"title"];
        [data setObject:@"Mark Twain" forKey:@"author"];
    }
    return self;
}

- (void)dealloc
{
    [data release];
    [super dealloc];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
    NSString *sel = NSStringFromSelector(selector);
    if ([sel rangeOfString:@"set"].location == 0) {
        return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
    } else {
        return [NSMethodSignature signatureWithObjCTypes:"@@:"];
    }
 }

- (void)forwardInvocation:(NSInvocation *)invocation
{
    NSString *key = NSStringFromSelector([invocation selector]);
    if ([key rangeOfString:@"set"].location == 0) {
        key = [[key substringWithRange:NSMakeRange(3, [key length]-4)] lowercaseString];
        NSString *obj;
        [invocation getArgument:&obj atIndex:2];
        [data setObject:obj forKey:key];
    } else {
        NSString *obj = [data objectForKey:key];
        [invocation setReturnValue:&obj];
    }
}

@end

int main(int argc, char **argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Book *book = [[Book alloc] init];
    printf("%s is written by %s\n", [book.title UTF8String], [book.author UTF8String]);
    book.title = @"1984";
    book.author = @"George Orwell";
    printf("%s is written by %s\n", [book.title UTF8String], [book.author UTF8String]);

   [book release];
   [pool release];
   return 0;
}
 13
Author: mirror,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-11 09:27:12

Zgodnie z dokumentacją:

Https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html

@ dynamic mówi kompilatorowi, że metody dostępu są dostarczane w czasie wykonywania.

Przy odrobinie śledztwa dowiedziałem się, że udostępnienie metod accessora zastępuje dyrektywę @dynamic.

@ synthesize każe kompilatorowi stworzyć te accessory dla Ciebie (getter i setter)

@ property mówi kompilatorowi, że accessory zostaną utworzone i że można uzyskać do nich dostęp za pomocą notacji kropkowej lub [wiadomość obiektu]

 9
Author: user1447414,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-03 18:25:15

Należy dodać, że jeśli właściwość jest zadeklarowana jako @ dynamic, nie zajmie ona pamięci (potwierdziłem przy pomocy instrumentu alokacji). Konsekwencją jest to, że możesz zadeklarować właściwość w kategorii class.

 6
Author: Yingpei Zeng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 09:14:48

zgodnie z dokumentacją Apple.

Używasz instrukcji @synthesize w bloku implementacji klasy, aby powiedzieć kompilatorowi, aby stworzył implementacje zgodne ze specyfikacją podaną w deklaracji @property.

Używasz instrukcji @dynamic, aby powiedzieć kompilatorowi, aby wstrzymał ostrzeżenie, jeśli nie może znaleźć implementacji metod accessora określonych w deklaracji @property.

Więcej info:-

Https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html

 1
Author: arango_86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 11:21:55