Я знаю, что в C каждая функция создает фрейм, и каждый кадр автоматически освобождается, когда функция, использующая его, заканчивается. Используется ли такая же логика для методов Objective-C? Создают ли они кадры в стеке при выполнении?Выполняет ли выполнение методов Objective-C «фреймы в стеке»?
ответ
Да, они делают.
Objective-C вызывает методы динамически, таким образом:
[someObject doSomething];
эквивалентно:
objc_msgSend(someObject, sel_registerName("doSomething"));
sel_registerName
возвращает селектор, который является в основном идентификатор метода, для данного метода имя.
objc_msgSend
записано на сборке, и код доступен here. Он просматривает селектор в списке методов объекта. Список Способа содержит IMP
для селектора doSomething
, которая является функцией С указателем на функцию, аналогичную:
void doSomething(id self, SEL _cmd);
objc_msgSend
затем tail-calls указатель функции,
Так методы являются лишь регулярными функциями C, но они называются динамически во время выполнения. Когда вызывается objc_msgSend
, обратный адрес помещается в стек, а CPU переходит на objc_msgSend
. Не похоже, что objc_msgSend
касается всего стека, поэтому метод устанавливает кадр стека точно так же, как функция C. Когда это будет сделано, метод скроет его стек стека и вернется точно так же, как функция C. Поскольку objc_msgSend
оставил нетронутый стек, он возвращается непосредственно к коду, который вызвал метод, точно так же, как если бы была непосредственно вызвана реализация метода.
- 1. Время, затраченное на выполнение всех методов в стеке методов
- 2. Выполнение кода в стеке
- 3. Преобразование методов из Java-actionscript в ObjectiveC
- 4. Выполнение atop в стеке докеров
- 5. Выполняет ли параллельное выполнение в SSIS правильно?
- 6. Выполняет ли реализация методов IEquatable прерывание сериализации?
- 7. Выполнение параллельных асинхронных методов
- 8. Выполняет ли эта программа параллельное выполнение?
- 9. Выполняет ли выполнение инструкции C# try/finally?
- 10. Выполняет ли cron-работу последнее выполнение cron?
- 11. Выполняет ли jQuery .load() автоматически выполнение скриптов?
- 12. Выполняет ли заблокированная нить штраф за выполнение?
- 13. Выполняет ли «clang» выполнение общего исключения подвыражения?
- 14. Выполняет ли `Any()` принудительное выполнение linq?
- 15. Java: Получить это для вышеописанных методов в стеке
- 16. Необходимы ли фреймы в javascript?
- 17. Возможно ли одновременное выполнение двух асинхронных методов?
- 18. Выполнение методов бесплатно (указатель)?
- 19. Выполнение двух методов параллельно
- 20. Выполняет ли абстрактное выполнение класса Внедрение всех абстрактных методов на первом уровне наследования, определенно?
- 21. Выполнение всех методов определения
- 22. Выполняет ли приведение методов UIResponder в подкласс UIView нарушать MVC?
- 23. Параллельное выполнение методов класса
- 24. Выполнение нескольких методов в WaitAll
- 25. Выполнение последовательности методов
- 26. Выполнение нескольких методов одновременно
- 27. Параллельное выполнение методов
- 28. Выполняет выполнение функции «Очередь операций»?
- 29. Выполняет ли AFNetworking выполнение действий в фоновом потоке?
- 30. Выполняет ли python выполнение задач в списках параллельно?
Хорошо, лаконично, ответ. Существует не так лаконичный ответ (с тонны дополнительной информации) здесь: http://stackoverflow.com/questions/2189212/why-object-dosomething-and-not-object-dosomething/2214980#2214980. Я думаю **, возможно, что оптимизация может дать хвостовой вызов 'objc_msgSend', который фактически сделает кадр« исчезающим »из стека, но я не помню, возможно ли это на современных архитектурах. – bbum
@bbum Да, clang генерирует хвостовые вызовы на 'objc_msgSend'. –
@robmayoff Спасибо. Так много архитектур ... так много компиляторов .... столько лет. :) – bbum