Рассмотрим эту ситуацию на гипотетическом языке ООП:
class A {
say_something(){
print("A!")
}
do_something(){
say_something()
}
}
и
class B : extends A {
say_something(){
print("B!")
}
}
Теперь предположим, что у вас есть экземпляр B
и вызовите do_something
:
B b;
b.do_something();
Должен ли b
напечатать A
или B
?Если вызов say_something
в реализации do_something
проходит через vtable
(в C ++) или obj_msgSend
(в Obj-C), он напечатает B
, но если компилятор решит вызватьметод в том же классе должен вызывать метод в том же классе, он напечатает A
.
Что желательно, зависит от ситуации.Таким образом, в C ++ у вас может быть выбор, помечая функцию-член virtual
или нет.В Objective-C каждый метод является виртуальным.
Таким образом, даже в C ++ предложенная вами оптимизация не относится к виртуальным методам.Я не скажу, что язык без виртуальных методов - это правильный язык ООП.
В любом случае, теперь вы можете опасаться, что это ухудшит производительность приложения Obj-C.Apple знает об опасности, поэтому у них есть много оптимизаций.Например, в недавней среде выполнения objc_msgSend
живет по фиксированному адресу, поэтому вам не нужно сначала проходить границу разделяемой библиотеки.
Статья о Мюлле-Кибернетике тоже была приятной, но заметьте также, что она очень устарела: она колоссальная десять лет назад, что в этом бизнесе доисторическое время.Вы можете прочитать о недавних оптимизациях для реализации objc_msgSend
в сообщениях в блоге bbum или сообщений в блоге Hamster .
Если вы пишете коды, управляющие пользовательским интерфейсом,использование стандартного обмена сообщениями (т. е. objc_msgSend
за кадром) вполне адекватно.Это даже работает очень гладко на мобильных устройствах!Поэтому не выполняйте преждевременную оптимизацию, получая IMP
и т. Д., Пока это не станет абсолютно необходимым после измерения производительности кода.
Если вы пишете с интенсивными вычислениямикод, включающий, скажем, десятки тысяч движущихся частиц, да, я бы посоветовал не использовать среду обмена сообщениями Obj-C.В этом случае просто напишите код на C (который всегда можно использовать в Objective-C) или код на C ++ (который можно использовать в Objective-C ++.)