Я протестировал некоторые isa swizzling с Swift и обнаружил, что он работает только тогда, когда NSObject является суперклассом (непосредственно или выше), или с использованием украшения '@objc'. В противном случае он будет следовать стилю статической и vtable-диспетчеризации, как C ++.
Нормально ли определять класс Swift без базового класса Cocoa / NSObject? Если это меня беспокоит, это означает отказ от большей части динамизма Objective-C, такой как перехват метода и самоанализ во время выполнения.
Динамическое поведение во время выполнения лежит в основе таких функций, как наблюдатели свойств, основные данные, аспектно-ориентированное программирование , обмен сообщениями высшего порядка , аналитические и журнальные структуры и т. Д.
Использование стиля вызова метода Objective-C добавляет к вызову метода около 20 операндов машинного кода, поэтому в определенных ситуациях ( много жестких вызовов методов с маленькими телами ) статическая отправка и отправка vtable в стиле C ++ могут работать лучше.
Но, учитывая общее правило 95-5 ( 95% прироста производительности достигается за счет настройки 5% кода ), не имеет ли смысла начинать с мощных динамических функций и укреплять там, где это необходимо?