Цель C: Распределение памяти в стеке против кучи
Я немного смущен, когда вещи распределяются по куче (и мне нужно их отпустить), и когда они выделены в стеке (и мне не нужно их перехватывать).
Есть ли правило?
Я думаю, что в С++ эмпирическое правило состоит в том, что если вы используете ключевое слово new
, оно находится в куче. Каково правило с объективным c? Как я могу сказать, когда что-то выделено в стеке?
Будет ли выделена эта строка кода в стеке?
NSString *user = @"DEFAULT";
Ответы
Ответ 1
В Objective-C легко: все объекты выделены в куче.
Это правило, если вы вызываете метод с alloc
или new
или copy
в имени (или вы вызываете retain
), вы являетесь владельцем этого объекта, и вы должны его выпустить в какой-то момент позже когда вы закончите с этим. Было много написано по этому вопросу.
Приведенный вами пример - это особый случай: статическая строка, я считаю, что она фактически находится в сегменте программных данных (в куче), но она статична, поэтому вам не нужно беспокоиться о ее освобождении.
Ответ 2
Objective-C легко в этом отношении.
Все Objective-C Объекты всегда размещаются в куче.
Или, по крайней мере, следует обращаться так, как если бы они находились в куче.
Для:
NSString *user = @"DEFAULT";
Строковый объект не является технически в куче, но может также быть. А именно, он генерируется компилятором и является частью вашего бинарного приложения. Его не нужно сохранять и освобождать, потому что класс (NSCFConstantString
, IIRC) переопределяет сохранение/освобождение/автоопределение, чтобы эффективно ничего не делать.
Что касается того, когда вы делаете и не выпускаете объекты, вы должны прочитать (и перечитать) Objective-C руководство по управлению памятью.
(Существует еще одно исключение, но это довольно эзотерическая деталь: блоки запускаются в стек, и вы можете Block_copy() их в кучу. Блоки также являются объектами Objective-C, но это редко встречается в использовать.)
Ответ 3
В Objective-C нет стековых распределений объектов (Блоки - это другой случай, в который я не собираюсь входить)
NSString *user = @"DEFAULT";
Это выделяет объект NSConstantString в постоянной памяти, а не в стеке.
Ответ 4
В Objective-C (и многих других языках) объект представляет собой просто непрерывный блок памяти с определенным макетом. Объекты обычно создаются в куче. Хранилище для самой переменной указателя объекта находится в стеке
но объект, на который он указывает, находится в куче.