Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Локальные переменные, кадры и стек Objective-C

0

В каждой функции могут определяться локальные переменные. Так называются переменные, объявленые внутри функции. Они существуют внутри только во время выполнения этой функции, и обращаться к ним можно только в пределах этой функции. Например, представьте. что мы пишем функцию для вычисления продолжительности приготовления индейки. она может выглядеть так:

void showCookTimeForTurkey(int pounds)

{

int necessaryMinutes = 15 + 15 * pounds; printf("Cook for %d minutes.\n", necessaryMinutes);

}

Здесь necessaryMinutes – локальная переменная. Она начинает свое существование с началом выполнения showCookTimeForTurkey() и уходит в небытие после завершения выполнения этой функции. Параметр функции pounds тоже является локальной переменной. Параметр представляет собой локальную переменную, инициализированную значением соответствующего аргумента.

Функция может иметь несколько локальных переменных; все они хранятся в

кадре этой функции. Представьте себе кадр в виде настенной доски, на которой можно писать во время работы функции. Когда выполнение функции завершается, с доски все стирается.

Допустим, мы работаем с рецептом печеной курицы. В вашей кухне у каждого рецепта имеется собственная доска для записи, поэтому доска с рецептом печеной курицы уже готова. Теперь при выполнении рецепта панировки вам понадобится новая доска. Где ее разместить? Прямо поверх доски с рецептом печеной курицы. В конце концов, выполнение этого рецепта было приостановлено, пока не будет готова панировка. Рецепт печеной курицы (кадр стека) вам все равно не понадобится, пока рецепт приготовления панировки не будет выполнен, а его кадр не освободится. Кадры, наложенные друг на друга, образуют стопку, или стек.

Рис. 5.3. Две доски с рецептами

Программисты говорят: «При вызове функции ее кадр создается на вершине

стека. При завершении функции ее кадр извлекается из стека и уничтожается».

Давайте   поближе   познакомимся   с   работой   стека,   помести   функцию

showCookTimeForTurkey() в гипотетическую программу:

void showCookTimeForTurkey(int pounds)

{

int necessaryMinutes = 15 + 15 * pounds; printf("Cook for %d minutes.\n", necessaryMinutes);

}

int main(int argc, const char * argv[])

{

int totalWeight = 10; int gibletsWeight = 1;

int turkeyWeight = totalWeight -­‐  gibletsWeight; showCookTimeForTurkey(turkeyWeight);

return 0;

}

Вспомните, что функция main() всегда выполняется первой. Функция main()

вызывает функцию showCookTimeForTurkey(), которая начинает выполняться. Как будет выглядеть стек программы сразу же после умножения pounds на 15?

Рис 5.4. Два кадра в стеке

Стек работает по принципу «последним пришел, первым вышел». Иначе говоря showCookTimeForTurkey() извлекает свой кадр из стека до того как main() извлечет свой кадр.

Обратите        внимание  :           pounds ,           единственный        параметр

showCookTimeForTurkey(), является частью кадра. Вспомните, что параметр представляет собой локальную переменную, которой присваивается значение соответствующего аргумента. В нашем примере переменная turkeyWeight со значением 9 передается в аргументе showCookTimeForTurkey(). Ее значение присваивается параметру pounds и копируется в кадр функции.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии