objective c - tutorial - @synthesize vs @dynamic, quelles sont les différences?



objective c ios (6)

Quelles sont les différences entre l'implémentation d'un @property avec @dynamic ou @synthesize ?

https://src-bin.com


Answer #1

@dynamic est généralement utilisé (comme cela a été dit plus haut) lorsqu'une propriété est créée dynamiquement au moment de l'exécution. NSManagedObject fait cela (pourquoi toutes ses propriétés sont dynamiques) - ce qui supprime certains avertissements du compilateur.

Pour un bon aperçu sur la façon de créer dynamiquement des propriétés (sans NSManagedObject et CoreData :, voir: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//apple_ref/doc/uid/TP40008048-CH102-SW1


Answer #2

@synthesize va générer des méthodes getter et setter pour votre propriété. @dynamic indique simplement au compilateur que les méthodes getter et setter ne sont pas implémentées par la classe elle-même mais ailleurs (comme la superclasse ou seront fournies lors de l'exécution).

Les utilisations de @dynamic sont par exemple avec des sous-classes de NSManagedObject (CoreData) ou lorsque vous voulez créer une sortie pour une propriété définie par une superclasse qui n'a pas été définie comme sortie.

@dynamic peut également être utilisé pour déléguer la responsabilité de l'implémentation des accesseurs. Si vous implémentez vous-même les accesseurs dans la classe, vous n'utilisez normalement pas @dynamic.

Super classe:

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

Sous-classe:

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

Answer #3

Jetez un oeil à cet article ; sous la rubrique "Méthodes fournies lors de l'exécution":

Certains accesseurs sont créés dynamiquement au moment de l'exécution, comme certains accesseurs utilisés dans la classe NSManagedObject de CoreData. Si vous souhaitez déclarer et utiliser des propriétés pour ces cas, mais que vous souhaitez éviter les avertissements sur les méthodes manquantes au moment de la compilation, vous pouvez utiliser la directive @dynamic au lieu de @synthesize.

...

L'utilisation de la directive @dynamic indique essentiellement au compilateur "ne vous en faites pas, une méthode est en route".

La directive @synthesize , quant à elle, génère les méthodes d' @synthesize pour vous au moment de la compilation (bien que cela soit indiqué dans la section "Mixer Synthesized and Custom Accessors", elle est flexible et ne génère pas de méthodes).


Answer #4

Selon la documentation:

developer.apple.com/library/mac/documentation/cocoa/conceptual/…

@dynamic indique au compilateur que les méthodes d'accès sont fournies lors de l'exécution.

Avec un peu d'enquête, j'ai découvert que la fourniture de méthodes d'accès surchargeait la directive @dynamic.

@synthesize dit au compilateur de créer ces accesseurs pour vous (getter et setter)

@property dit au compilateur que les accesseurs seront créés, et que l'on peut y accéder avec la notation pointée ou [message d'objet]


Answer #5

voici un exemple de @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:"[email protected]:@"];
    } 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;
}

Answer #6

Selon la documentation Apple.

Vous utilisez l'instruction @synthesize dans le bloc d'implémentation d'une classe pour indiquer au compilateur de créer des implémentations qui correspondent à la spécification que vous avez donnée dans la déclaration @property .

Vous utilisez l'instruction @dynamic pour indiquer au compilateur de supprimer un avertissement s'il ne trouve pas une implémentation de méthodes d' @property spécifiées par une déclaration @property .

Plus d'informations:-

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





synthesize