Pregunta

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

¿Fue útil?

Solución

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

usos para @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 estaba definido como una salida.

@dynamic también se puede utilizar para delegar la responsabilidad de la aplicación de los métodos de acceso. Si implementa los métodos de acceso a sí mismo dentro de la clase, entonces normalmente no utiliza @dynamic.

superclase:

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

Subclase:

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

Otros consejos

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

  

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

     

...

     

Uso de la directiva @dynamic dice esencialmente el compilador de "no preocuparse por ello, es un método en el camino."

La directiva @synthesize, por el contrario, genera los métodos de acceso para que en tiempo de compilación (aunque como se señala en los "descriptores de acceso personalizados La mezcla sintetizada y" sección es flexible y no genera métodos para ti, si bien se implementan) .

Como otros han dicho, en general utilizar @synthesize tener el compilador genera los captadores y / o ajustes para ti, y @dynamic si se va a escribirlos usted mismo.

Hay otra sutileza aún no se ha mencionado: @synthesize que pueda proporcionar una implementación a sí mismo, ya sea de un captador o un regulador. Esto es útil si sólo desea implementar el captador de alguna lógica adicional, pero dejar que el compilador genera el colocador (que, para los objetos, es por lo general un poco más complejo para escribir usted mismo).

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

@dynamic se utiliza normalmente (como se ha dicho anteriormente) cuando una propiedad está siendo creado dinámicamente en tiempo de ejecución. NSManagedObject hace esto (¿por qué todas sus propiedades son dinámicos) -. 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

aquí es 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;
}

De acuerdo con 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 proporcionan métodos de acceso anulan la directiva @dynamic.

@synthesize le dice al compilador para crear esos descriptores de acceso para usted (get y set)

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

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

De acuerdo con la documentación de Apple.

Se utiliza la instrucción @synthesize en el bloque implementación de una clase para decirle al compilador para crear implementaciones que coinciden con la especificación que diste en la declaración @property.

Se utiliza la instrucción @dynamic para decirle al compilador para suprimir una advertencia si no puede encontrar una implementación de métodos de acceso especificados por una declaración @property.

Más información: -

https://developer.apple. com / biblioteca / ios / documentación / general / conceptual / DevPedia-CocoaCore / DeclaredProperty.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top