Как отмечает sha, локальные переменные размещаются в текущем кадре стека. Как только текущий вызов функции возвращается, стек «выталкивается», и память, занятая для текущего вызова, не освобождается, а просто освобождается, пока не будет перезаписана следующим вызовом, который помещается в эту часть стека.
Так почему же мы должны выпускать переменные следующим образом:
MyClass *myObject = [[MyClass alloc] init];
Ну, на самом деле вам не нужно беспокоиться о «myObject». Он в стеке, как и ваши целые, и будет очищен после завершения текущего вызова.
Что вам нужно беспокоиться, так это память, которую myObject - указатель - указывает на . Это где-то в куче. Построение объекта включает запрос времени выполнения для некоторого полупостоянного места, чтобы поместить это; этот процесс возвращает адрес памяти, который хранит ваш указатель.
alloc
и release
- это идиомы Objective-C, которые в значительной степени заменяют функции C malloc()
и free()
, но все они в конечном итоге просят компьютер выделить память в куче и всю эту память в конечном итоге должен быть возвращен через пул авто-релиза, сообщение release
или вызов free()
.