Подтвердить что ты не робот

Цель C: Распределение памяти в стеке против кучи

Я немного смущен, когда вещи распределяются по куче (и мне нужно их отпустить), и когда они выделены в стеке (и мне не нужно их перехватывать).

Есть ли правило?

Я думаю, что в С++ эмпирическое правило состоит в том, что если вы используете ключевое слово new, оно находится в куче. Каково правило с объективным c? Как я могу сказать, когда что-то выделено в стеке?

Будет ли выделена эта строка кода в стеке?

NSString *user = @"DEFAULT";
4b9b3361

Ответ 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 (и многих других языках) объект представляет собой просто непрерывный блок памяти с определенным макетом. Объекты обычно создаются в куче. Хранилище для самой переменной указателя объекта находится в стеке но объект, на который он указывает, находится в куче.