@synthesize vs @dynamic, каковы различия?

Каковы различия между реализацией @property с @dynamic или @synthesize ?

    @synthesize будет генерировать методы getter и setter для вашего свойства. @dynamic просто сообщает компилятору, что методы getter и setter реализуются не самим classом, а где-то в другом месте (например, суперclass или будут предоставлены во время выполнения).

    Используется для @dynamic, например, с подclassами NSManagedObject (CoreData) или когда вы хотите создать выход для свойства, определенного суперclassом, который не был определен как выход.

    @dynamic также может использоваться для делегирования ответственности за внедрение аксессуаров. Если вы реализуете аксессуры самостоятельно в classе, вы обычно не используете @dynamic.

    Супер class:

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

    Подclass:

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

    Взгляните на эту статью ; под заголовком «Методы, предоставляемые во время выполнения»:

    Некоторые аксессоры создаются динамически во время выполнения, например, некоторые из них используются в classе NSManagedObject от CoreData. Если вы хотите объявить и использовать свойства для этих случаев, но хотите избежать предупреждений о методах, отсутствующих во время компиляции, вы можете использовать директиву @dynamic вместо @synthesize.

    Использование директивы @dynamic по сути говорит компилятору: «Не беспокойтесь об этом, метод в пути».

    С другой стороны, директива @synthesize генерирует методы доступа для вас во время компиляции (хотя, как указано в разделе «Смешивание синтезированных и пользовательских аксессуаров», она гибкая и не генерирует методы для вас, если они реализованы).

    Как говорили другие, в общем случае вы используете @synthesize, чтобы компилятор генерировал геттеры и / или настройки для вас, и @dynamic, если вы собираетесь писать их самостоятельно.

    Есть еще одна тонкость, о которой еще не упоминалось: @synthesize позволит вам реализовать реализацию самостоятельно, как получателя, так и сеттера. Это полезно, если вы хотите только реализовать getter для некоторой дополнительной логики, но пусть компилятор сгенерирует setter (который для объектов обычно немного сложнее писать самостоятельно).

    Однако, если вы пишете реализацию для аксессуара @ synhesize’d, она все равно должна поддерживаться реальным полем (например, если вы пишете -(int) getFoo(); вас должно быть поле int foo; ). Если значение генерируется чем-то другим (например, вычисляется из других полей), вы должны использовать @dynamic.

    @dynamic обычно используется (как было сказано выше), когда свойство динамически создается во время выполнения. NSManagedObject делает это (почему все его свойства являются динамическими), что подавляет некоторые предупреждения компилятора.

    Для получения хорошего обзора о том, как создавать свойства динамически (без NSManagedObject и CoreData: см. http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#// apple_ref / DOC / UID / TP40008048-CH102-SW1

    вот пример @dynamic

     #import  @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; } 

    Согласно документации:

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

    @dynamic сообщает компилятору, что методы доступа доступны во время выполнения.

    С небольшим расследованием я обнаружил, что предоставление методов доступа отменяет директиву @dynamic.

    @synthesize сообщает компилятору создать для вас эти аксессуры (getter и setter)

    @property сообщает компилятору, что будут созданы аксессоры, и к ним можно получить доступ с помощью точечной нотации или [сообщения объекта]

    Одна вещь, которую нужно добавить, состоит в том, что если свойство объявлено как @dynamic, оно не будет занимать память (я подтвердил с помощью инструмента распределения). В результате вы можете объявить свойство в classе.

    Согласно документации Apple.

    Вы используете оператор @synthesize в блоке реализации classа, чтобы сообщить компилятору о создании реализаций, соответствующих спецификации, которую вы @property объявлении @property .

    Вы используете оператор @dynamic чтобы сообщить компилятору подавить предупреждение, если он не может найти реализацию методов доступа, указанных в объявлении @property .

    Больше информации:-

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

    Давайте будем гением компьютера.