Obj-C не является C ++.
В C ++ каждый класс имеет известный (во время компиляции) набор виртуальных функций, который обычно значительно меньше, чем полный набор функций, определенных для этого класса и всех его подклассов. (В C ++ вы должны явно указать, какие функции являются виртуальными, и по умолчанию они не являются.)
В Obj-C каждый метод является «виртуальным» (на языке C ++), список селекторов является переменным, методы могут быть переопределены во время выполнения (добавлены и заменены), а список неопределен (технически, вы можете отправить любой объект любое сообщение, даже если оно не отвечает, делает это).
Так что в C ++ довольно просто построить линейный массив каждой виртуальной функции, которую объект должен будет отправить, назначить смещение в этом массиве для каждой функции и скомпилировать его в код.
Если вы хотите использовать виртуальные диспетчерские таблицы в Obj-C, вам нужно создать массив для каждого класса, который содержит каждый возможный селектор. Для даже скромных программ каждый список будет огромным, и он будет расти в геометрической прогрессии с ростом сложности проекта Я имею в виду, что каждый класс будет иметь свой собственный массив (что?) 20000 различных селекторов, и есть тысячи классов ...
С другой стороны, хэш-таблица содержит набор переменных указателей на функции метода, определенных для этого класса. Набор обычно является только подмножеством селекторов, которые фактически были отправлены этим объектам, поэтому он намного ( намного ) меньше, чем полный набор селекторов, которые вы потенциально могли бы отправить объекту этого класса. Это делает хеш-таблицу методов эффективной и самооптимизируемой, даже если отправка занимает немного больше времени.