Понимание, когда вызывать удерживать на объекте? - PullRequest
6 голосов
/ 15 декабря 2010

Когда следует использовать retain?Я понимаю, что это увеличивает количество ссылок на объекты, поэтому в основном следующее release для этого объекта не вызовет dealloc для него.Хорошо, отлично, и что?Я прочитал вокруг, что это какое-то соглашение, что, если вы заботитесь об объекте, вы retain его.Есть ли примеры этого там?Это даже правда?

РЕДАКТИРОВАТЬ:

Я не ищу, когда отладчик говорит вам сделать это или это.Итак, я посмотрел на этот .

Чтобы выразить это словами, вот пример использования retain

  • в вашем коде: вы где-то вызываете метод, который возвращает объект, который у вас нет
  • вы работаете с этим объектом
  • , затем вы хотите освободить его => вы не можете , потому что вы не владелец
  • Ваше решение - использовать copy или retain.Если вы используете retain, то вы получите право собственности на этот объект.
  • , а затем, чтобы освободить этот объект, вы либо выполняете 2 release (так как ref ref равен 1 + 1 при сохранении), либо используете напрямуюdealloc на нем

Это так?Я так не думаю, потому что объект может иметь несколько владельцев.Итак, для последнего пункта, вызов dealloc действительно «убьет» объект;но с 2 release вы не будете владельцем, но программа, которая его создала, все равно останется, поэтому объекты где-то еще живы (утечка? зомби?)

Пожалуйста, я запутался.

Ответы [ 4 ]

6 голосов
/ 15 декабря 2010

Все ваши ответы находятся в Руководстве по управлению памятью .

РЕДАКТИРОВАТЬ

После вашего редактирования, здесь есть более конкретные детали:

в вашем коде вы где-то вызываете метод, метод, который возвращает объект, который вам не принадлежит

Поскольку вы не владеете им, у вас нет контроляна протяжении всей жизни.Он может быть освобожден, если вы все еще полагаете, что он является действительным объектом.

вы работаете с этим объектом

Никогда не уверен, что он будет существовать.

тогда вы хотите выпустить его => вы не можете, потому что вы не владелец

Но почему вы хотите выпустить его?Вы не являетесь владельцем объекта, поэтому не несете ответственности за его управление памятью.

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

Вот как это должно работать:

  • Вы вызываете метод, который возвращает объект.Если вы не получили этот объект, вызвав alloc, new, copy или mutableCopy, то в соответствии с Руководство по управлению памятью вы не являетесь владельцем объекта, поэтому вы не 'Ответственный за управление этой памятью.
  • В большинстве случаев вы можете предположить, что вам был передан автоматически выпущенный объект.Это означает, что вы не можете контролировать его жизнь.Чтобы убедиться, что он не будет выпущен до того, как вы покончили с ним, вы вызываете retain для объекта.Теперь вы владеете этим объектом и несете ответственность за вызов release в будущем.Ошибка новичка - теперь беспокоиться о сохранении счета на объекте.Не будьВсе, что имеет значение, это то, что вы отвечаете за вызов release.
  • Вы используете объект, имея в виду общую парадигму управления памятью.Например, если вы добавите этот объект в NSArray, он будет сохранен в массиве.
  • После того, как вы сделали то, что вам нужно сделать с объектом, вы вызываете для него release.Снова.Не беспокойтесь о количестве сохраняемых объектов или о том, какие другие объекты используют этот объект.Все, что имеет значение, это то, что вы сбалансировали свои звонки на retain с равным количеством звонков на release.
1 голос
/ 15 декабря 2010

Я обычно просто явно использую retain, когда это необходимо, и отладчик XCode сообщает мне, что только что произошло, когда возникает такая ситуация. Обычно по какой-либо причине (неумелое руководство со стороны разработчика или если за кулисами происходит какой-то релиз), вы делаете что-либо с освобожденным объектом, вы получите сбой. Просто прочитайте журнал на консоли, посмотрите отладчик на XCode, когда вы отлаживаете, и вы обычно выясняете, какой объект вызывает проблему.

0 голосов
/ 15 декабря 2010

Марсель, управление памятью является ключевым моментом в разработке iOS-приложений.Вам следует прочитать документацию Apple об этом, как предложили другие ребята.

Я могу добавить сюда некоторую информацию, чтобы попытаться помочь вам с вашими потребностями.

Процесс управления памятью с помощью Obj-С является счетной базой.Это означает, что каждый раз, когда вы «удерживаете» какой-либо объект, система улучшает счетчик для этого объекта.Например, если вы создадите кнопку и «сохраните» ее, она будет иметь значение 1. Если вы сохраните ее снова, у нее будет значение 2. Чтобы полностью уничтожить этот объект, вам нужно будет дважды отпустить его.Каждый раз, когда объект имеет значение 0, он будет уничтожен.

Мое личное мнение: Если вы хотите иметь хороший контроль над управлением памятью вашего приложения, хорошо бы явно сохранить и уничтожить ваши объекты, избегаяАвто-релиз, когда это возможно.Опять же, это мое личное мнение.Мне нравится осознавать процесс памяти в моих приложениях, поэтому я предпочитаю точно позаботиться об этом.

Конечно, это не ЛУЧШИЙ путь, каждый разработчик предпочтет использовать свой подход к управлению памятью.

Опять же: найдите время, чтобы прочитать документацию, предложенную Abizem.Конечно, у вас будет лучшее понимание об этом.

0 голосов
/ 15 декабря 2010

Проверьте Руководство для начинающих Objective-C для базового использования

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