Pregunta @synthesize vs @dynamic, ¿cuáles son las diferencias?


¿Cuáles son las diferencias entre implementar una @property con @dynamic o @synthesize?


537
2017-07-21 17:12


origen


Respuestas:


@synthesize generará métodos getter y setter para su propiedad. @dynamic simplemente le dice al compilador que los métodos getter y setter no son implementados por la clase sino en otro lugar (como la superclase o se proporcionarán en tiempo de ejecución).

Los usos de @dynamic son, p. con subclases de NSManagedObject (CoreData) o cuando desea crear una salida para una propiedad definida por una superclase que no se definió como una salida.

@dynamic también se puede usar para delegar la responsabilidad de implementar los accessors. Si implementa los accesadores usted mismo dentro de la clase, normalmente no usa @dynamic.

Súper clase:

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

Subclase:

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

718
2017-07-21 17:21



Echa un vistazo a Este artículo; bajo el título "Métodos proporcionados en tiempo de ejecución":

Algunos accesadores se crean dinámicamente en tiempo de ejecución, como ciertos utilizados en la clase NSManagedObject de CoreData. Si desea declarar y usar propiedades para estos casos, pero desea evitar advertencias sobre métodos que faltan en tiempo de compilación, puede usar la directiva @dynamic en lugar de @synthesize.

...

El uso de la directiva @dinámica básicamente le dice al compilador "no se preocupe, un método está en camino".

los @synthesize directiva, por otro lado, genera los métodos de acceso para usted en tiempo de compilación (aunque como se indica en la sección "Mezcla de intérpretes sintetizados y personalizados" es flexible y no genera métodos para usted si se implementan).


209
2017-07-21 17:20



Como han dicho otros, en general, usa @synthesize para que el compilador genere los captadores y / o la configuración para usted, y @dynamic si los va a escribir usted mismo.

Hay otra sutileza aún no mencionada: @synthesize será le permite proporcionar una implementación usted mismo, ya sea de un getter o un setter. Esto es útil si solo quiere implementar el getter para alguna lógica adicional, pero deje que el compilador genere el setter (que, para los objetos, suele ser un poco más complejo para usted mismo).

Sin embargo, si escribe una implementación para un programa de acceso @ sintetizado, debe estar respaldada por un campo real (por ejemplo, si escribe -(int) getFoo(); debes tener un int foo; campo). Si el valor está siendo producido por otra cosa (por ejemplo, calculado a partir de otros campos), entonces debe usar @dynamic.


29
2017-07-21 18:04



@dynamic se usa normalmente (como se ha dicho anteriormente) cuando una propiedad se crea dinámicamente en tiempo de ejecución. NSManagedObject hace esto (por qué todas sus propiedades son dinámicas), lo que suprime algunas advertencias del compilador.

Para obtener una buena visión general sobre cómo crear propiedades dinámicamente (sin NSManagedObject y CoreData :, ver: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//apple_ref/doc/uid/TP40008048-CH102-SW1


14
2017-11-25 21:30



aquí está  ejemplo 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:"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
2017-09-11 09:27



Según la documentación:

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

@dynamic le dice al compilador que los métodos de acceso se proporcionan en tiempo de ejecución.

Con un poco de investigación, descubrí que la provisión de métodos de acceso anula la directiva @dynamic.

@synthesize le dice al compilador que cree esos accesadores para usted (getter y setter)

@property le dice al compilador que se crearán los accesos, y que se puede acceder con la notación de puntos o [objeto de mensaje]


9
2017-12-03 18:25



Una cosa que quiero agregar es que si una propiedad se declara como @dynamic no ocupará memoria (confirmé con el instrumento de asignación). Una consecuencia es que puede declarar propiedad en la categoría de clase.


6
2018-05-13 09:14



De acuerdo con la documentación de Apple.

Usas el @synthesize declaración en el bloque de implementación de una clase para decirle al compilador que cree implementaciones que coincidan con la especificación que dio en el @property declaración.

Usas el @dynamic declaración para decirle al compilador que suprima una advertencia si no puede encontrar una implementación de los métodos de acceso especificados por un @property declaración.

Más información:-

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


0
2017-12-16 11:21