Не беспокойтесь о `retainCount`?В самом деле? - PullRequest
0 голосов
/ 28 июля 2010

Мне сказали не беспокоиться о сохранении счета. Я понимаю, что не должен принимать решение release или retain, используя условную логику, основанную на retainCount, но не стоит ли мне об этом беспокоиться? Я думал, что они каким-то образом соответствуют использованию памяти.

Например, если у меня есть группа подпредставлений UIView, которые я также поместил в NSArray, чтобы иметь возможность их перебирать, разве это не удваивает счет удержания и, следовательно, использование памяти приложения? Если это так, это дорого или тривиально, если подпредставления, скажем, 500 UIControl экземпляров? Это предполагает, что мне, конечно, нужно 500 экземпляров.

Ответы [ 5 ]

7 голосов
/ 28 июля 2010

Значение, возвращаемое retainCount, является абсолютным числом раз, когда объект был сохранен.UIView исходит от фреймворка, реализация которого непрозрачна.Подробности реализации - это не то, о чем вам следует беспокоиться, за исключением документированного интерфейса, с которым вы взаимодействуете.

И в этой реализации экземпляры UIView могут быть сохранены любое количество раз как часть реализации.С точки зрения памяти, фактическое количество удержаний не имеет смысла;1 - это то же самое, что и 5.

Единственное, что вас должно волновать, это то, как ваш код изменяет количество объектов. .

Если ваш код увеличивает удержаниесчитайте, это должно уменьшить его где-нибудь, или объект будет держаться вечно.Если вы retain, вы должны release (или autorelease).Если вы copy, вы должны release или autorelease.Если вы new или alloc, вы должны release (или autorelease).

Вот и все.

6 голосов
/ 28 июля 2010

Вы не должны беспокоиться о retainCount, потому что это часто вводит в заблуждение детали реализации системы подсчета ссылок.То, о чем вы должны беспокоиться, это соблюдение правильной политики владения объектами.

Время от времени я публикую это из документации Apple:

Важно: Этот метод обычно не имеет значения при отладке проблем управления памятью.Поскольку любое количество объектов каркаса могло сохранить объект для хранения ссылок на него, в то время как пулы автоматического выпуска могут содержать любое количество отложенных выпусков для объекта, маловероятно, что вы можете получить полезную информацию из этогоmethod.

Что касается вашего последнего вопроса, ваше использование памяти не увеличится вдвое при добавлении объектов из одного массива в другой.Счетчик сохранения - это просто целое число без знака в объекте, которое увеличивается на 1, когда что-то претендует на владение им.Но опять же, не беспокойтесь об этом.

5 голосов
/ 28 июля 2010

Например, если у меня есть куча подпредставлений UIView, которые я также поместил в NSArray, чтобы иметь возможность перебирать их, разве это не удваивает количество сохраненных файлов ...

Да, будет.

... и, следовательно, использование памяти приложением?

Нет! Вывод неверный. 1000000 занимает столько места, сколько 0 при хранении в виде 32-разрядного целого числа.

2 голосов
/ 28 июля 2010

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

Вы должны спроектировать, как ваше приложение работает так, чтобы использование памяти не было чрезмерным.

Вам следует беспокоиться о том, сколько объектов у вас в памяти и сколько раз вы сохранили их (это число, которое будетбыть меньше, чем retainCount), и удостовериться, что вы отпускаете их столько раз, сколько сохраняете их.

Многократное обращение к объекту retain по-прежнему приводит к тому, что в памяти остается только одна копия объекта.

Чтобы проверить использование памяти и / или утечки, вы используете детектор утечки инструментов.

1 голос
/ 28 июля 2010

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

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