2017-02-08 2 views
2

Я знаю, что в C каждая функция создает фрейм, и каждый кадр автоматически освобождается, когда функция, использующая его, заканчивается. Используется ли такая же логика для методов Objective-C? Создают ли они кадры в стеке при выполнении?Выполняет ли выполнение методов Objective-C «фреймы в стеке»?

ответ

5

Да, они делают.


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 оставил нетронутый стек, он возвращается непосредственно к коду, который вызвал метод, точно так же, как если бы была непосредственно вызвана реализация метода.

+0

Хорошо, лаконично, ответ. Существует не так лаконичный ответ (с тонны дополнительной информации) здесь: http://stackoverflow.com/questions/2189212/why-object-dosomething-and-not-object-dosomething/2214980#2214980. Я думаю **, возможно, что оптимизация может дать хвостовой вызов 'objc_msgSend', который фактически сделает кадр« исчезающим »из стека, но я не помню, возможно ли это на современных архитектурах. – bbum

+1

@bbum Да, clang генерирует хвостовые вызовы на 'objc_msgSend'. –

+0

@robmayoff Спасибо. Так много архитектур ... так много компиляторов .... столько лет. :) – bbum

Смежные вопросы