Каково поведение 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.