Управление памятью примитивных типов C в объективе c

Если я выделяю объект в своей программе, мне нужно его освободить. Если я создам int, нужно ли мне вызывать free(myint) или переменная будет автоматически уничтожена в конце моей функции? Кроме того, если я добавляю свойства int, long или bool к своим объектам, нужно ли мне обрабатывать then в Dealloc или они также будут уничтожены, когда функция, которую я использую, будет завершена?


person user1122069    schedule 14.07.2012    source источник


Ответы (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. В противном случае значение выделяется «в соответствии» с остальной частью вашего объекта и не требует отдельного освобождения.

person Sergey Kalinichenko    schedule 14.07.2012

Как надмножество C, правила для автоматических переменных стека такие же. Таким образом, определение int x; в функции означает, что вам не нужно ничего делать для ее очистки, потому что она находится в стеке. Распределение кучи, такое как int *x = malloc(...);, в какой-то момент нуждается в free(x); для очистки. Если эти шаги происходят внутри объекта (например, в init), то это та же идея; поле int можно оставить в покое, но выделение должно быть сбалансировано освобождением в методе dealloc класса.

person Kevin Grant    schedule 14.07.2012

основной ключевой момент управления памятью (без каких-либо более глубоких деталей), вы должны release все объекты, которые вы создали, как new, alloc или copy; или после того, как вы увеличили счетчик retain для текущего объекта.

в любом другом случае вам не нужно беспокоиться о вызове метода release, и вы не должны этого делать, это может привести к сбою.

(это были только грубые основы управления памятью без ARC)

вам не нужно беспокоиться о примитивах, за исключением случаев, когда вы ранее выделили для них память с помощью alloc(...); или malloc(...);; в этом случае вы должны free(...); выделенную память после того, как вы закончили их использовать.

person holex    schedule 14.07.2012