@synthesize против @dynamic, в чем различия?

Я думаю, что лучшее (самое простое и самое портативное) решение представляет собой комбинацию ответов @rlotun и @Stephen:

default = '/default/path/'
dir = raw_input('Folder [%s]' % default)
dir = dir or default
548
задан Wayne Chen 17 May 2017 в 16:52
поделиться

3 ответа

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

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

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

Суперкласс:

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

Подкласс:

@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
733
ответ дан 22 November 2019 в 22:18
поделиться

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

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

...

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

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

211
ответ дан 22 November 2019 в 22:18
поделиться

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

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

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

29
ответ дан 22 November 2019 в 22:18
поделиться