Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Куча Objective-C

0

До сих пор в своих программах мы использовали только память, выделяемую в кадрах стека. Эта память автоматически выделяется в начале функции и автоматически освобождается в конце. (Из-за этого удобного поведения локальные переменные часто называют автоматическими переменными.)

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

Длинную последовательность байтов программисты часто называют буфером. (Кстати, отсюда и происходит термин «буферизация», который вы видите, пока дожидаетесь загрузки достаточного количества байтов для запуска очередного видеоролика с котом с Youtube.)

Для выделения буфера в памяти используется функция malloc(). Буфер выделяется из области памяти, называемой кучей (heap), которая существует отдельно от стека. Завершив работу с буфером, следует вызвать функцию free() для освобождения памяти и ее возвращения в кучу. Допустим, нам понадобился блок памяти, достаточный для хранения 1000 чисел типа float.

#include <stdio.h>

#include <stdlib.h> // malloc and free are in stdlib int main(int argc, const char * argv[])

{

// объявление указателя float *startOfBuffer;

// запрос на выделение байтов из кучи startOfBuffer = malloc(1000 * sizeof(float));

// …работа с буфером…

// освобождение памяти для повторного использования free(startOfBuffer);

// забываем, с какого адреса начинался выделенный блок startOfBuffer = NULL;

return 0;

}

Указатель startOfBuffer ссылается на первое вещественное число в буфере.

Рис. 11.1. Указатель на буфер, выделенный в куче, хранится в стеке

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

Функция malloc( ) также может использоваться для выделения памяти под структуру. Например, если вы хотите выделить в куче память для хранения структуры Person, программа может выглядеть так:

#include <stdio.h>

#include <stdlib.h> typedef struct {

float heightInMeters; int weightInKilos;

} Person;

float bodyMassIndex(Person *p)

{

return p-­‐>weightInKilos / (p-­‐>heightInMeters * p-­‐>heightInMeters);

}

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

{

// выделение памяти для одной структуры Person Person *x = (Person *)malloc(sizeof(Person));

// присваивание значений полям структуры x-­‐>weightInKilos = 81;

x-­‐>heightInMeters = 2.0;

// вывод ИМТ

float xBMI = bodyMassIndex(x); printf("x has a BMI of = %f\n", xBMI);

// освобождение памяти free(x);

// забываем начальный адрес x = NULL;

return 0;

}

Обратите    внимание    на    оператор    -­‐>.    Запись    p-­‐>weightInKilos  означает:

«Разыменоватъ   указатель   р на   структуру   и   обратиться   к   полю   с   именем

weightInKilos».

Идея хранения структур в куче открывает массу замечательных возможностей. В частности, она закладывает основу для работы с объектами Objective-C. Этой теме будет посвящена следующая часть книги.

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

По теме:

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