2016-11-24 2 views
22

В чем разница между маркировкой метода как @objc vs dynamic, когда вы делаете одно против другого?Swift 3 - dynamic vs @objc

Ниже приведено определение Apple для динамического.

dynamic Применить этот модификатор к любому члену класса, который может быть представлен Objective-C. Когда вы отмечаете объявление участника с помощью динамического модификатора, доступ к этому члену всегда динамически отправляется с использованием среды выполнения Objective-C. Доступ к этому члену - , никогда не встроенный или девиртуализированный компилятором.

Поскольку объявления, отмеченные динамическим модификатором, отправляются с использованием среды выполнения Objective-C, они неявно отмечены атрибутом objc .

+0

На ваш вопрос ответили? – Alexander

ответ

26

Функция/переменная, объявленная как @objc, доступна из Objective-C, но Swift будет продолжать доступ к ней напрямую через статическую или виртуальную отправку. Это означает, что если функция/переменная swizzled через инфраструктуру Objective-C, например, что происходит при использовании Key-Value Observing или различных API Objective-C для изменения классов, вызов метода из Swift и Objective-C приведет к разным результатам ,

Использование dynamic сообщает, что Swift всегда ссылается на динамическую отправку Objective-C. Это необходимо для правильной работы таких вещей, как Key-Value Observing. Когда вызывается функция Swift, она ссылается на среду выполнения Objective-C для динамической отправки вызова.

+0

Я не знал, что KVO подпевает, не могли бы вы рассказать об этом? – Boon

+2

@Boon KVO создает динамический подкласс, заменяя ваше свойство тем, которое завернуто в вызовы willChangeValueForKey/didChangeValueForKey, если только автоматическиNotifiesObserversForKey используется для отказа. – kevin

6

Как указывается в цитате, dynamic подразумевает @objc.

Если вы не указали класс как dynamic, компилятор может свободно оптимизировать и внедрить его методы. Это приносит огромные преимущества в производительности, но это означает, что вы не можете изменить эти реализации метода во время выполнения. Если вы планируете возиться с этими методами во время выполнения, используя возможности отражения времени выполнения Objective C, вам нужно будет использовать dynamic. Вы понесете штраф за производительность (ваш код будет работать на уровне уровня Objective C, а не вблизи уровней C), но вы получите дополнительный динамизм.

Смежные вопросы