objective-c cocoa cocoa-touch synthesize

objective c - @synthesize vs @dynamic, ¿cuáles son las diferencias?



objective-c cocoa (8)

@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 descripción general sobre cómo crear propiedades dinámicamente (sin NSManagedObject y CoreData :, consulte: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//apple_ref/doc/uid/TP40008048-CH102-SW1

¿Cuáles son las diferencias entre la implementación de una @property con @dynamic o @synthesize ?


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

Los usos de @dynamic son, por ejemplo, con subclases de NSManagedObject (CoreData) o cuando se 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 accesores. Si implementa usted mismo los accesores dentro de la clase, entonces normalmente no usa @dynamic.

Super clase

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

Subclase:

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


Como han dicho otros, en general, usa @synthesize para que el compilador genere los captadores y / o configuraciones para usted, y @dynamic si va a escribirlos usted mismo.

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

Sin embargo, si escribe una implementación para un acceso @ synthesize''d, todavía debe estar respaldado por un campo real (por ejemplo, si escribe -(int) getFoo(); debe tener un campo int foo; ). Si el valor está siendo producido por otra cosa (por ejemplo, calculado a partir de otros campos), entonces tiene que usar @dynamic.


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

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

...

El uso de la directiva @dynamic esencialmente le dice al compilador "no te preocupes por eso, hay un método en camino".

La directiva @synthesize , por otro lado, genera los métodos de acceso para usted en el momento de la compilación (aunque como se indica en la sección "Mezclar sintetizadores y accesores personalizados", es flexible y no genera métodos para usted si se implementan).


Según la documentación:

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

@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 proporcionar métodos de acceso anula la directiva @dynamic.

@synthesize le dice al compilador que cree esos accesores para ti (getter y setter)

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


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.


Aquí hay un 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; }


Según la documentación de Apple.

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

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

Más información:-

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