Что является общим случаем использования @dynamic?

Предыдущее сообщение о различии @synthesize и @dynamic уже есть.

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

Обычно мы используем @dynamic вместе с NSManagedObject

// Movie.h
@interface Movie : NSManagedObject {
}
@property (retain) NSString* title;
@end

// Movie.m
@implementation Movie
@dynamic title;
@end

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

Мой вопрос в том, что в этом случае NSManagedObject, какова грубая реализация получателя / установщика в суперклассе NSManagedObject?

За исключением случая, указанного выше, сколько еще случаев использовать @dynamic?

Спасибо,


person Forrest    schedule 24.12.2010    source источник
comment
Как уже сказал Джастин, ключевым моментом является то, что @dynamic ЯВНО ОСТАНАВЛИВАЕТ компилятор от создания собственных средств доступа. Если у вас нет @dynamic (т. Е. Если у вас ничего нет), в этот день может произойти что угодно, с разными версиями и т. Д.   -  person Fattie    schedule 04.07.2016


Ответы (1)


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

  1. Если вы предоставили только половину средства доступа (например, средство получения без средства установки для свойства readwrite) или используете GCC, компилятор вас предупредит.
  2. Если вы используете Clang для компиляции кода, соответствующие аксессоры будут автоматически сгенерированы для вас. (Synthesize-by-default официально не поддерживается.)

@dynamic поэтому полезен для предотвращения выполнения компилятором любого из вышеперечисленных действий. Это также может пригодиться, если вы реализуете свойство очень динамично, например, с функциями времени выполнения, но это редко необходимо.

person Justin Spahr-Summers    schedule 24.12.2010
comment
Извините, это была экспериментальная функция, которую они с тех пор удалили. Синтезируемым свойствам теперь требуется явный @synthesize. Я обновлю свой ответ. - person Justin Spahr-Summers; 15.02.2012
comment
Я думаю, ты сможешь восстановить себе второй балл. Свойства теперь синтезируются по умолчанию afaik (также см. stackoverflow.com/q/11666008/6827) - person Asaf R; 11.08.2015