NSMutableString и nil для управления памятью - PullRequest
5 голосов
/ 26 февраля 2009

Если у меня есть NSMutableString, например

NSMutableString *foo = [[NSMutableString alloc] init];

если я обнуляю объект, foo = nil, уменьшает ли это счетчик удержаний на 1, таким образом эффективно освобождая память? Должен ли я перераспределить foo из кучи в этот момент, чтобы иметь возможность использовать его?

Ответы [ 5 ]

8 голосов
/ 26 февраля 2009

Пожалуйста, прочитайте базовую документацию . Установка переменной foo в nil ничего не делает с ее предыдущим содержимым. Помните, foo это просто указатель на объект; чтобы использовать его, вы должны указать ему действительный объект. Просто чтобы он больше не указывал на этот объект, он не освобождает объект.

5 голосов
/ 26 февраля 2009

Назначение nil для переменной не влияет на значение, которое было ранее там. Количество отсчетов уменьшается только на release.

Вы должны прочитать рекомендации Apple по управлению памятью какао . Система подсчета ссылок в Какао не так уж сложна, но вы должны научиться этому, и если вы не научитесь правильно, в вашей программе будет множество мелких ошибок, которые приведут вас в бешенство.

4 голосов
/ 26 февраля 2009

То, что все сказали выше, абсолютно верно. Вам нужен релиз в этом фрагменте кода.

Однако , важно иметь в виду, что присвоение свойству уменьшит количество сохраняемых данных, если это правильно. То есть:

foo = nil;         // doesn't lower
bar.foo = nil;     // probably does

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

2 голосов
/ 26 февраля 2009
это уменьшает счет удержания на 1, эффективно освобождая память?
нет

Нет

Вы должны использовать

[foo release]
0 голосов
/ 26 февраля 2009

foo = nil; не уменьшит количество сохраняемых объектов. Он просто укажет foo на точку, а не на объект. Чтобы уменьшить счет удержания, вам придется сказать [foo release];.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...