Pull to refresh

Comments 10

Message Dispatch работает в рантайме

все остальные, за исключением Direct, тоже работают в рантайме.

Ниже разберем баг с протоколом

это фича, а не баг)

Спасибо за уточнение! Да, Virtual Table и Witness Table тоже работают в рантайме. А пример с протоколом, возможно, для некоторых разработчиков будет считаться и фичей. Но чаще разработчики ошибаются в этом и получают неожиданный результат

В статье написано что все value type используют Direct dispatch. А что если, например, структура реализует протокол. Какой тип диспетчеризации будет?

let x: SomeProtocol = StructWithSomeProtocol()

Будет динамическая диспетчеризация.

Если только одна структура имплементит этот протокол (и больше никто - ни класс, ни другое), то это развернется в Direct компилятором с высокой вероятностью.

Добавлю для любопытствующих цитату из питча про экзистенциальные контейнеры, чтобы подкрепить коммент:

In addition to heap allocation and reference counting, code using existential types incurs pointer indirection and dynamic method dispatch that cannot be optimized away.

Добрый день! Хоть и с запозданием, отвечаем :) Объект (в данным случае структура) будет реализовывать 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")
    }
}

Sign up to leave a comment.