Как работает работа с iOS Swift Runtime

В ObjC используется ObjC Messaging, static binding, dynamic typing, dynamic binding, dynamic method resolution, dynamic loading, introspector и т.д.

Важно отметить, что основной метод objc_msgSend отвечает за то, что вы отправляете селектор и отправляете его объект, и рассматриваете это в таблицах методов класса, чтобы выяснить, какой именно кусок кода должен обрабатывать его.

Мои проблемы здесь:

  1. Является ли Swift делать что - то подобное, как ObjC во время выполнения?

  2. Как Swift runtime находит код реализации для некоторого метода object/class?

  3. В ObjC classes и objects скомпилируются для некоторых runtime types таких как C struct во время выполнения. Тогда каковы такие classes и objects скомпилированные в runtime в Swift?

  4. Есть ли у Swift runtime что-то вроде class/meta class/isa pointer/super pointer?

Ответы

Ответ 1

Короче говоря, есть динамический и статический типы диспетчеризации вызовов методов.

  1. Статический - адрес вызываемой функции определяется во время компиляции, поэтому затраты на такой вызов аналогичны вызову C-функции. Этот механизм используется для private методов или диспетчеризации вызовов методов final классов.

  2. Динамическая диспетчеризация - это механизм, который позволяет реализовать концепцию полиморфизма ООП - адрес вызываемой функции определяется во время выполнения. У Swift есть два подтипа:

    2.1. Obj-C - вы уже описали в вопросе. Этот механизм используется, когда объект наследуется от NSObject или вызывающий метод имеет префикс @objc.

    2.2. На основе виртуальной таблицы (как в C++) - есть похожие таблицы-свидетели. Во время диспетчеризации вызова метода он выполняет только одну арифметическую операцию - вычисление фактического адреса функции на основе смещения функции в таблице-свидетеле базового класса и расположения таблицы-свидетеля класса объекта. Так что относительно дешевая операция по сравнению с Obj-C. Это объясняет, почему "чистый" Swift приближается к производительности C++.

Если вы не помечаете свой метод с помощью private ключевого слова или ваш класс не является final и в то же время ваш класс является "чистым" Swift (он не наследует NSObject), тогда используется этот механизм на основе виртуальной таблицы. Это означает, что все методы по умолчанию являются virtual.

PS Полезная ссылка для подтверждения моего видения относительно "Типов":

https://developer.apple.com/swift/blog/?id=27

Объяснение "подтипов" основано на моем понимании.