Comments 10
Message Dispatch работает в рантайме
все остальные, за исключением Direct, тоже работают в рантайме.
Ниже разберем баг с протоколом
это фича, а не баг)
В статье написано что все value type используют Direct dispatch. А что если, например, структура реализует протокол. Какой тип диспетчеризации будет?
let x: SomeProtocol = StructWithSomeProtocol()
Будет динамическая диспетчеризация.
Добрый день! Хоть и с запозданием, отвечаем :) Объект (в данным случае структура) будет реализовывать Witness Table соответственно. Но переменные, которые относятся именно к самой структуре, будут по-прежнему реализоваться с Direct Dispatch. Соответственно, у данной структуры будут реализованы Direct Dispatch и Witness Table.
Message Dispatch лежит в основе KVO (и соответственно в реактивном программировании)
А можете ссылку на код в репозитории RxSwift где там в основе KVO?
Message Dispatch часто используется для тестирования кода. Редко его можно встретить в проде
Вы на UIKit не пишете? Foundation и CoreData не используете?
Message Dispatch часто используется для тестирования кода. Редко его можно встретить в проде, так как это не очень безопасный вызов и относится к самой медленной диспетчеризации.
Что-нибудь про кэширование посылаемых сообщений доводилось читать?
При реализации дефолтного метода протокола с помощью его расширения, диспетчеризация c Witness Table (об этом больше информации представлено ниже) меняется на Direct Dispatch.
Это не совсем так. Если в расширении мы определяем новый метод, то только в таком случае диспетчеризация будет статической. Если мы добавляем имплементацию к методу, уже определенному в протоколе, то в таком случае она остается динамической.
protocol MethodDispatch {
func methodA() // Dynamic dispatch
func methodC() // Dynamic dispatch
}
extension MethodDispatch {
func methodB() { // Static dispatch
print("B")
}
func methodC() { // Dynamic dispatch
print("C")
}
}
Диспетчеризация в Swift: погружение в теорию и практику