Pergunta

Quais são as diferenças entre a implementação de um @property com @dynamic ou @synthesize?

Foi útil?

Solução

@synthesize irá gerar os métodos getter e setter para sua propriedade. @dynamic apenas informa ao compilador que os métodos get e set não são implementadas pela própria classe, mas em outro lugar (como a superclasse ou será fornecido em tempo de execução).

usos para @dynamic são por exemplo com subclasses de NSManagedObject (CoreData) ou quando você quer criar uma saída para uma propriedade definida por uma superclasse que não foi definido como uma saída.

Também @dynamic pode ser usado para delegar a responsabilidade de implementar os acessores. Se você implementar os acessores de si mesmo dentro da classe, então você normalmente não usar @dynamic.

class Super:

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

Subclasse:

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

Outras dicas

Dê uma olhada este artigo ; sob o título "Métodos fornecidos em tempo de execução":

Alguns assessores são criadas dinamicamente em tempo de execução, tais como certos os usados ??em sala de aula NSManagedObject de CoreData. Se você quiser declarar e propriedades de uso para esses casos, mas quer evitar avisos sobre métodos faltando em tempo de compilação, você pode usar a diretiva @dynamic vez de @synthesize.

...

Usando a directiva @dynamic, essencialmente, diz o compilador "não se preocupe com isso, um método está a caminho."

A directiva @synthesize, por outro lado, gera os métodos de acesso para você em tempo de compilação (embora, como indicado na secção "A mistura sintetizada e personalizada Accessors" seção é flexível e não gera métodos para você se quer são implementados) .

Como já foi dito, em geral você usa @synthesize ter o compilador gerar os getters e / ou configurações para você, e @dynamic se você estiver indo para escrever-los sozinho.

Há uma outra sutileza ainda não mencionado: @synthesize irá que você fornecer uma implementação mesmo, de qualquer um getter ou setter. Isso é útil se você só quer implementar o getter para alguma lógica extra, mas mantém o compilador gerar o setter (que, para objetos, geralmente é um pouco mais complexo para escrever a si mesmo).

No entanto, se você escrever uma implementação para um @ synthesize'd acessor ainda deve ser feito por um campo real (por exemplo, se você escrever -(int) getFoo(); você deve ter um campo int foo;). Se o valor está sendo produtos por outra coisa (por exemplo, calculado a partir de outros campos), então você tem que usar @dynamic.

@dynamic é normalmente usado (como foi dito acima) quando uma propriedade está sendo criado dinamicamente em tempo de execução. NSManagedObject faz isso (porque todas as suas propriedades são dinâmicas.) - que suprime alguns avisos do compilador

Para uma boa visão geral sobre como criar propriedades dinamicamente (sem NSManagedObject e CoreData :, ver: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html# // apple_ref / doc / uid / TP40008048-CH102-SW1

aqui é exemplo 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 acordo com a documentação:

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

@dynamic diz ao compilador que os métodos de acesso são fornecidos em tempo de execução.

Com um pouco de investigação eu descobri que o fornecimento de métodos de acesso substituir a directiva @dynamic.

@synthesize diz o compilador para criar esses assessores para você (getter e setter)

@property diz ao compilador que os acessores será criado, e que podem ser acessados ??com a notação de ponto ou [mensagem objeto]

Uma coisa deseja adicionar é que, se uma propriedade é declarada como @dynamic não vai ocupar memória (I confirmado com o instrumento de alocação). A consequência é que você pode declarar propriedade na categoria de classe.

De acordo com a documentação da Apple.

Você usar a instrução @synthesize no bloco implementação de uma classe para dizer ao compilador para criar implementações que correspondem à especificação de que você deu na declaração @property.

Você usar a instrução @dynamic para dizer ao compilador para suprimir um aviso se ele não pode encontrar uma implementação de métodos de acesso especificadas por uma declaração @property.

Mais informações: -

https://developer.apple. com / biblioteca / ios / documentação / general / conceitual / DevPedia-CocoaCore / DeclaredProperty.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top