Каковы различия между реализацией @property
с @dynamic
или @synthesize
?
559
Каковы различия между реализацией @property
с @dynamic
или @synthesize
?
@synthesize сгенерирует методы getter и setter для вашей собственности. @dynamic просто сообщает компилятору, что методы getter и setter реализуются не самим классом, а где-то еще (например, суперклассом или будут предоставлены во время выполнения).
Используется для @dynamic, например, с подклассами NSManagedObject
(CoreData) или когда вы хотите создать выход для свойства, определенного суперклассом, который не был определен как выход.
@dynamic также может использоваться для делегирования ответственности за реализацию методов доступа. Если вы сами реализуете методы доступа внутри класса, то вы обычно не используете @dynamic.
Супер класс:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
Подкласс:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
NSUnknownKeyException
ошибки с моим динамическим свойством, когда я удалял@synthesize
строку (Xcode 3.2 выдавал мне ошибку, потому что у меня не было соответствующего ivar для моего @property). Добавление@dynamic
исправило проблему - теперь компилируется и работает нормально. Спасибо!@property
предметы, которые не имеют и@synthesize
не@dynamic
будут автоматически синтезироваться. Для каждого свойства будет создан ивар с начальным подчеркиванием, например_propertyName
, вместе с соответствующим геттером и сеттером.Взгляните на эту статью ; под заголовком «Методы, предоставляемые во время выполнения»:
@synthesize
Директива, с другой стороны, создает методы доступа для вас во время компиляции (хотя , как отмечался в разделе «Смешивание синтезатор и пользовательское Accessors» он является гибким и не создает методы для вас , если либо реализуется).источник
Как уже говорили другие, вы обычно используете @synthesize, чтобы компилятор генерировал для вас геттеры и / или настройки, и @dynamic, если вы собираетесь писать их самостоятельно.
Существует еще одна тонкость еще не упомянул: @synthesize будет препятствовать вам обеспечить реализацию себя, либо геттер или сеттера. Это полезно, если вы хотите реализовать метод получения только для некоторой дополнительной логики, но позвольте компилятору сгенерировать метод установки (который для объектов обычно немного сложнее написать самостоятельно).
Однако, если вы пишете реализацию для метода доступа @ synthesize, он все равно должен быть поддержан реальным полем (например, если вы пишете
-(int) getFoo();
вас должно бытьint foo;
поле). Если значение создается чем-то другим (например, вычисляется из других полей), тогда вы должны использовать @dynamic.источник
@dynamic
если вы собираетесь написать их самостоятельно" Нет, вы НЕ используете динамические, если вы пишете их сами.@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
источник
Согласно документации:
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html
@dynamic сообщает компилятору, что методы доступа предоставляются во время выполнения.
После небольшого исследования я обнаружил, что предоставление методов доступа переопределяет директиву @dynamic.
@synthesize говорит компилятору создать эти методы доступа для вас (getter и setter)
@property сообщает компилятору, что методы доступа будут созданы, и к ним можно получить доступ с помощью точечной нотации или [объекта сообщения]
источник
Хочу добавить, что если свойство объявлено как @dynamic, оно не будет занимать память (я подтвердил это с помощью инструмента выделения). Как следствие, вы можете объявить свойство в категории класса.
источник
Согласно документации Apple.
Вы используете
@synthesize
оператор в блоке реализации класса, чтобы сказать компилятору создавать реализации, которые соответствуют спецификации, которую вы дали в@property
объявлении.Вы используете
@dynamic
оператор, чтобы сказать компилятору подавить предупреждение, если он не может найти реализацию методов доступа, указанных в@property
объявлении.Больше информации:-
https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html
источник