Frage

Was sind die Unterschiede zwischen einem @property mit @dynamic oder @synthesize Umsetzung?

War es hilfreich?

Lösung

@synthesize wird Getter und Setter-Methoden für Ihre Immobilie generieren. @dynamic sagt nur den Compiler, dass die Getter und Setter-Methoden implementiert werden nicht von der Klasse selbst, sondern woanders (wie die übergeordneten Klasse oder zur Laufzeit zur Verfügung gestellt werden).

Verwendet für @dynamic zum Beispiel sind mit Unterklassen von NSManagedObject (Coredata), oder wenn Sie möchten, einen Auslass für ein Objekt durch eine übergeordnete Klasse definiert schaffen, die nicht als Auslass definiert wurde.

@dynamic können auch die Verantwortung für die Durchführung der Accessoren delegieren verwendet werden. Wenn Sie den Zugriffs- sich innerhalb der Klasse implementieren dann normalerweise Sie nicht verwenden @dynamic.

Super-Klasse:

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

Unterklasse:

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

Andere Tipps

Hier finden Sie aktuelle diesem Artikel ; unter der Überschrift „Methoden zur Laufzeit zur Verfügung gestellt“:

  

Einige Zugriffsmethoden werden zur Laufzeit dynamisch erstellt, wie bestimmte diejenigen, die in Coredata der NSManagedObject Klasse. Wenn Sie erklären möchten und verwenden Eigenschaften für diese Fälle, wollen aber Warnungen über Methoden zu vermeiden, bei der Kompilierung fehlt, können Sie die @dynamic Richtlinie anstelle von @synthesize.

     

...

     

Mit der @dynamic Direktive weist im Wesentlichen den Compiler „nicht darum kümmern, ein Verfahren auf dem Weg ist.“

Die @synthesize Richtlinie, auf der anderen Seite erzeugt die Zugriffsmethoden für Sie bei der Kompilierung (obwohl, wie in dem „Mischen synthetisierte und individuell Accessors“ Abschnitt erwähnte es flexibel ist und erzeugt keine Methoden für Sie, wenn entweder implementiert werden) .

Wie andere gesagt haben, im Allgemeinen Sie verwenden @synthesize der Compiler zu haben, erzeugen die Getter und / oder Einstellungen für Sie, und @dynamic, wenn Sie sie selbst gehen zu schreiben.

Es gibt eine andere Feinheit noch nicht erwähnt: @synthesize wird können Sie bieten eine Implementierung selbst, entweder aus einem Getter oder Setter. Dies ist nützlich, wenn Sie nur den Getter für einige zusätzliche Logik implementieren wollen, aber lassen Sie den Compiler den Setter generieren (was für Objekte, ist in der Regel ein wenig komplexer, sich zu schreiben).

Wenn Sie jedoch für eine @ eine Implementierung tun schreiben synthesize'd es noch von einem realen Feld gesichert werden Accessor muss (zum Beispiel, wenn Sie schreiben -(int) getFoo(); Sie ein int foo; Feld haben muss). Wenn der Wert produzieren wird durch etwas anderes (zum Beispiel aus anderen Bereichen berechnet), dann müssen Sie verwenden @dynamic.

@dynamic typischerweise verwendet wird (wie oben gesagt worden ist), wenn eine Eigenschaft wird dynamisch zur Laufzeit erzeugt werden. NSManagedObject tut dies (warum alle seine Eigenschaften dynamisch sind.) - die einige Compiler-Warnungen unterdrückt

Für einen guten Überblick darüber, wie Eigenschaften dynamisch erzeugen (ohne NSManagedObject und Coredata :, siehe: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html# // apple_ref / doc / uid / TP40008048-CH102-SW1

hier ist Beispiel @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;
}

Gemäß der Dokumentation:

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

@dynamic teilt den Compiler mit, dass die Zugriffsmethoden zur Laufzeit zur Verfügung gestellt werden.

Mit einem wenig Untersuchung fand ich heraus, dass die Bereitstellung von Zugriffsmethoden, die @dynamic Richtlinie außer Kraft setzen.

@synthesize teilt den Compiler diese Accessoren für Sie (Getter und Setter)

erstellen

@property teilt den Compiler mit, dass die Zugriffsmethoden erstellt werden, und das kann mit der Punktnotation oder [Objektmeldung]

zugegriffen werden

Eine Sache hinzufügen will, ist, dass, wenn eine Eigenschaft als deklariert ist @dynamic es Speicher nicht besetzen (I mit Zuteilung Instrumente bestätigt). Eine Folge davon ist, dass Sie Eigenschaft in der Klasse Kategorie deklarieren können.

Gemäß der Apple-Dokumentation.

Sie verwenden die @synthesize-Anweisung in einer Implementierung Block Klasse den Compiler zu sagen, Implementierungen zu erstellen, die die Spezifikation, die Sie in der @property Erklärung gaben entsprechen.

Sie verwenden die @dynamic Anweisung, um den Compiler zu sagen, um eine Warnung zu unterdrücken, wenn es nicht eine Implementierung von Zugriffsmethoden angegeben durch eine @property Erklärung finden kann.

Mehr Infos: -

https://developer.apple. com / library / ios / Dokumentation / Allgemein / Conceptual / DevPedia-CocoaCore / DeclaredProperty.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top