Управление памятью о CGPoint - PullRequest
       9

Управление памятью о CGPoint

2 голосов
/ 17 сентября 2010

см. Требуется объяснение CGPointMake?

Исправьте меня, если я ошибаюсь, в реализации CGPointMake, CGPoint p; объявляют локальную переменную struct, которая должна быть освобождена после выхода из области видимости. Но почему функция может возвращать значение без риска?

В любом случае, предположим, что реализация CGPointMake верна, я должен освободить CGPoint, созданный CGPointMake?

Ответы [ 2 ]

7 голосов
/ 17 сентября 2010

Его не нужно освобождать, потому что он никогда не жил в куче. Только выделенная куча память должна быть освобождена. Память, выделенная в стеке (как это делается в CGPointMake()), будет очищена автоматически после того, как метод / функция существует.

Функция может вернуть точку, потому что компилятор видит: «Ага, эта функция хочет вернуть структуру, которая имеет размер sizeof(CGPoint) байтов, поэтому я позабочусь, чтобы в слоте памяти возвращаемого значения было достаточно места такой большой. " Затем, когда функция завершается, возвращаемое значение копируется в слот возврата памяти, функция завершается, а значение в возвращаемом слоте копируется в новое место назначения.

0 голосов
/ 17 сентября 2010

Функция может возвращать CGPoint, потому что структура "достаточно мала", чтобы быть возвращенной непосредственно из функции. Вы не возвращаете указатель, вы возвращаете все это напрямую. То же самое с методами, которые принимают CGPoints в качестве параметров - вы можете передать все это по значению напрямую.

Как отмечает Дейв, CGPoints - это не объекты, а просто структуры. CGPointMake не «выделяет» память. Это просто функция, которая возвращает структуру, настроенную с правильными размерами, которую вы обычно записываете в локальный файл в своем стеке или передаете или как угодно.

Как и любой другой примитивный тип (int, float или другая структура), его не нужно освобождать, когда он выходит из области видимости.

(Примечание: многие архитектуры / компиляторы / «двоичные интерфейсы приложений» имеют оптимизации и ограничения по размеру, касающиеся размера объекта, используемого в качестве аргумента или возвращаемого значения. В этом случае CGPoint может фактически полностью поместиться в один 64- битовый регистр (2x 32-битные числа с плавающей запятой), что делает его не более тяжелым, чем возвращающий int. Но компилятор может также выполнять другие приемы, такие как копирование в и из более крупных структур, например CGRect.)

...