Если я выделяю объект в своей программе, мне нужно его освободить. Если я создам int, нужно ли мне вызывать free(myint) или переменная будет автоматически уничтожена в конце моей функции? Кроме того, если я добавляю свойства int, long или bool к своим объектам, нужно ли мне обрабатывать then в Dealloc или они также будут уничтожены, когда функция, которую я использую, будет завершена?
Управление памятью примитивных типов C в объективе c
Ответы (3)
Если я создам int, нужно ли мне вызывать free(myint) или переменная будет автоматически уничтожена в конце моей функции?
Это зависит от того, как вы это делаете: автоматические переменные примитивных типов освобождаются, когда они выходят за рамки:
if (a == b) {
int sum = 0;
sum = a + b;
NSLog(@"%d", sum);
}
Если вы выделяете свой примитив с помощью malloc
или calloc
, вы должны использовать free
в конце (хотя я не знаю, почему вы хотите использовать такие примитивы):
if (a == b) {
int *sumPtr = malloc(sizeof(int));
*sumPtr = a + b;
NSLog(@"%d", *sumPtr);
free(sumPtr);
}
Те же правила соблюдаются, когда вы добавляете примитивные поля к своим объектам: если вы используете malloc
в init
, то вы должны использовать free
в dealloc
. В противном случае значение выделяется «в соответствии» с остальной частью вашего объекта и не требует отдельного освобождения.
Как надмножество C, правила для автоматических переменных стека такие же. Таким образом, определение int x;
в функции означает, что вам не нужно ничего делать для ее очистки, потому что она находится в стеке. Распределение кучи, такое как int *x = malloc(...);
, в какой-то момент нуждается в free(x);
для очистки. Если эти шаги происходят внутри объекта (например, в init
), то это та же идея; поле int
можно оставить в покое, но выделение должно быть сбалансировано освобождением в методе dealloc
класса.
основной ключевой момент управления памятью (без каких-либо более глубоких деталей), вы должны release
все объекты, которые вы создали, как new
, alloc
или copy
; или после того, как вы увеличили счетчик retain
для текущего объекта.
в любом другом случае вам не нужно беспокоиться о вызове метода release
, и вы не должны этого делать, это может привести к сбою.
(это были только грубые основы управления памятью без ARC)
вам не нужно беспокоиться о примитивах, за исключением случаев, когда вы ранее выделили для них память с помощью alloc(...);
или malloc(...);
; в этом случае вы должны free(...);
выделенную память после того, как вы закончили их использовать.