Разработка iPhone - Уроки в управлении памятью - PullRequest
8 голосов
/ 21 января 2009

Мне нужны уроки по управлению памятью. У меня есть приложение, которое использует несколько представлений (около 10), некоторые из них прикреплены к контроллеру вкладок. Проблема в том, что я использую изображения (многие изображения, которые я загружаю из веб-службы). Я сталкиваюсь со следующими проблемами.

  1. Память продолжает увеличиваться, когда я прокручиваю в табличном представлении (почему?) - я проверил приложение CustomTableViewCell с сайта Apple, и оно показывает те же признаки, когда я запускаю его с инструментами.

  2. Я использую авто-релиз со многими объектами, но я вижу, что эти объекты на самом деле не освобождаются, а память подключена. Как я могу избавиться от этих объектов?

  3. Как я могу сказать NSAutoreleasePool периодически выпускать объекты, которые не используются? Я думаю, что это может помочь мне избавиться от проводной памяти. Но могу ли я это сделать?

Существует ли какой-либо пример Apple или кого-либо еще (книги или статьи в Интернете), объясняющий, как использовать инструменты (немного подробнее с примером?) И для тонкой настройки приложения на память и производительность?

Спасибо.

Ответы [ 5 ]

8 голосов
/ 21 января 2009

Теперь, когда у нас есть ответы «просто скажи нет» на автоматический выпуск, я решил добавить подсказку о том, как использовать автоматический выпуск более эффективно. Что бы там ни было, не все будут полностью избегать авто-релиза - если только по какой-то другой причине, кроме Apple, предоставляет так много удобных методов, которые передают вам автоматически выпущенные объекты.

Вы не можете просто сказать пулу автоматического выпуска освободить объекты, которые вы не используете. Там нет сборки мусора, а как еще это узнать?

Что вы МОЖЕТЕ сделать, так это создать локальный пул автоматического выпуска, а затем освободить его, когда вам больше не нужны локальные объекты автоматического выпуска. Если у вас есть блок, в котором вы создаете автоматически выпущенные объекты, вы убедитесь, что они освобождаются, создав локальный пул автоматического выпуска в начале блока (просто выделите / инициализируйте его, не требуя магии), а затем освободите пул в конец блока. И вуаля, и объекты в бассейне тоже освобождены.

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

1 голос
/ 21 января 2009

UITableView позволяет повторно использовать ячейки таблицы, которые больше не отображаются. Таким образом, если вы отображаете только 6 ячеек на экране одновременно, он не создает больше при прокрутке, а использует ячейки, которые исчезли с экрана. всякий раз, когда вы хотите создать новую ячейку, сначала сделайте запрос к табличному представлению, чтобы выяснить, можно ли его использовать повторно, а если нет, то создайте новую.

пример этого можно найти на слайде 55 примечания к стандартному курсу iphone здесь: http://www.scribd.com/doc/7671058/Standford-CS-193P-11Performance

1 голос
/ 21 января 2009

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

Другими словами, если вы знаете, что закончили с объектом, явно отпустите его.

1 голос
/ 21 января 2009

Автоматически освобожденная память освобождается, когда элемент управления возвращается обратно в систему, но только когда он выбирает. Если вы хотите принудительно освободить память, используйте «release», который тут же работает.

Следует отметить, что из-за фрагментации памяти выделение и освобождение блока памяти может не вернуть вас к тому, с чего вы начали, с точки зрения измеримой "свободной" памяти.

Tony

0 голосов
/ 21 января 2009

Согласно Apple, вам не следует использовать авто-релиз, а вместо этого следует явно сохранять и освобождать объекты по мере необходимости. autorelease не освобождает объект, как только его функция заканчивается. Если в представлении таблицы вы используете изображения, загруженные с веб-службы, попробуйте кэшировать эти изображения и, если возможно, использовать их повторно. Другой вариант - получить только те изображения, которые отображаются.

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