Каково поведение msgSendSuper в Objective-C?

Проверяя код диспетчеризации сообщений Apple с открытым исходным кодом, я замечаю, что при вызове super используется структура, содержащая экземпляр и класс, из которого он должен найти метод суперкласса.

Означает ли это, что компилятор должен явно изменить сообщения на super, добавив класс, из которого он вызывается?

И с учетом некоторого дерева классов, где C расширяет, B расширяет A, и все они реализуют метод m какие звонки [super m]и мы создаем D, расширяющий A во время выполнения, захватывая реализацию C m использовать как D; будут [d m] на самом деле вызвать все методы D, B и A m вместо просто D и A?

1 ответ

Решение

Читая дизассемблирование, компилятор изменит вызов super на загрузку адреса класса из фиксированного списка, создание структуры с экземпляром и вызов objc_msgSendSuper2,

Поскольку ссылки на классы являются фиксированными константами, создание дерева классов с указанными методами и вызов метода m на объекте D действительно будет выполнять реализацию B m хотя D не подкласс B.

Другие вопросы по тегам