О dealloc / release: это всегда нормально делать x = nil; [х релиз]; - или это может вызвать проблемы? - PullRequest
0 голосов
/ 11 августа 2010

, поскольку каждое присваивание переменной с другим объектом увеличивает количество сохраняемых данных, и в разлочке не всегда ясно, как часто переменная, которой присваивается простая [версия maVar], может НЕ быть достаточной.Таким образом, использование ВСЕГДА myVar = nil устанавливает счетчик хранения равным нулю, и последующий [myVar release] никогда не вызовет проблемы снова.(действительно ли это все еще требуется?)

Единственная ситуация, когда этого не сделать, - это если myVar передается OUT, тогда я не должен этого делать, поскольку значение уничтожается myVar = nil;

Правильно ли мое мышление?Или этот способ избежать утечек может вызвать другие проблемы?

Ответы [ 2 ]

3 голосов
/ 11 августа 2010

Ваше мышление неверно во многих отношениях. Это, вероятно, просто царапает поверхность:

  • Присваивание переменной не увеличивает ее количество сохраняемых данных. (Есть некоторые тонкости, связанные с свойствами, но, честно говоря, это далеко за пределы того уровня, на котором мы находимся.)
  • dealloc называется , когда счет сохранения достигает 0 .
  • Настройка myVar = nil не влияет на счет удержания .
  • myVar = nil уничтожает только значение локального указателя, но не уничтожает объект, который был передан.
  • Безопасно звонить [myVar release], когда myVar равен nil, но это бесполезно - ничего не делает.
  • Беспокойство по поводу сохранения количества всегда ошибка. Беспокойся о том, что у тебя есть .

Понятно, что вам не хватает указателей C и управления памятью Objective-C. Я бы посоветовал сделать некоторые исправительные C работы, прежде чем несколько тщательных перечитываний Документов по управлению памятью .

1 голос
/ 11 августа 2010

Пожалуйста, прочитайте документацию Apple по Управление памятью .

Присвоение указателя на объект не увеличит счет retain, это будет делать только вызов retain.Функции с Copy или Init в имени должны возвращать объект с счетом сохранения 1, другие функции должны возвращать автоматически освобожденные объекты, которые будут освобождены после завершения основного цикла.

Установка для объекта nilне изменяет счет сохранения, но это приведет к утечке памяти.Вызов release на указателе в этой точке по сути ничего не делает.Вы должны нести ответственность за использование retain, release, autorelease и за то, как вы называете свои функции, если хотите эффективно управлять использованием памяти.

...