iPhone - приложение извлекается - PullRequest
3 голосов
/ 22 февраля 2010

У меня есть приложение, которое выбрасывается iPhone OS из-за «нехватки памяти».

Я прошел через инструменты и не вижу утечек, а использование памяти составляет около 640 КБ.

Приложение вылетает при добавлении объектов на экран.

Вот как это работает. У меня есть класс на основе UIImageView, который очень прост и добавляет несколько свойств к объектам. Этот класс используется для созданных объектов.

Когда пользователь нажимает кнопку, создается новое изображение этого класса и добавляется в self.view.

После добавления около 15 объектов приложение извлекается с предупреждением о нехватке памяти.

Инструменты сообщают об отсутствии значительного использования памяти. Даже после добавления 15 объектов запись ALL ALLOCATIONS никогда не выходит за пределы 660 КБ. Каждый объект может быть одним из пяти изображений размером 120x120 пикселей.

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

Спасибо за любую помощь.

Ответы [ 3 ]

6 голосов
/ 23 февраля 2010

Инструмент ObjectAlloc не показывает все использование памяти в вашем приложении. Представления и другие визуальные элементы не показывают их полный размер в ObjectAlloc, поэтому вы можете использовать инструмент Memory Monitor, чтобы в любой момент увидеть фактический объем памяти вашего приложения.

Кроме того, если прибор не сообщает об утечках, это не означает, что его там нет. Запустите ваше приложение через Clang Static Analyzer, чтобы еще раз взглянуть на потенциальные утечки памяти (через Build | Build and Analyze в Xcode 3.2 или , загрузив автономный инструмент ). Опять же, даже если это проходит и вы все еще видите непрерывное увеличение потребления памяти, у вас где-то есть утечка.

Вы упоминаете об использовании Кварцевого рисунка в ваших комментариях. Вы должны помнить, что объекты Core Foundation, используемые в Quartz, также следуют определенной модели управления памятью, где все, что вы создаете с помощью функции, имеющей Create в своем имени, должно быть освобождено с использованием функции сопоставления, такой как CFRelease(). Это может не проявиться как утечка, если вы забудете об этом, но это так.

1 голос
/ 23 февраля 2010

Утечки не ваша проблема. Чрезмерное удержание.

Посмотрите на распределение объектов. Если этот график только растет и растет, ваше приложение будет убито. Что особенно раздражает iPhone - это когда вам говорят, что нужно освободить память (предупреждение о нехватке памяти), и память не освобождается. Ваш код может быть просто крайним случаем этого, но вы должны освободить ЧТО-ТО, когда получите это сообщение.

0 голосов
/ 23 февраля 2010

Я обнаружил, что проблема не имеет ничего общего с моим кодом. Каждый раз, когда я использую кварц на iPhone, у меня возникает такая проблема.

Кварц имеет серьезную проблему, которая должна быть исправлена. Насколько я обнаружил, он получает куски памяти для выполнения рисования и не освобождает их, даже если вы освобождаете все переменные и ссылки, которые вы используете. Даже если вы положите все переменные ноль.

Кварц - пожиратель памяти и источник сбоев.

Вот проект, который я создал, чтобы продемонстрировать, как Quartz может разбить ваш проект. Ищите метод внутри MyClass.m, называемый imageWithBorderFromImage. Этот метод использует кварц, чтобы нарисовать пунктирную границу вокруг объекта. Запустите проект и нажмите несколько раз на кнопку. Каждый раз, когда вы нажимаете, новый объект добавляется на экран поверх предыдущего. Примерно после 20 кликов приложение выбрасывается с трамплина. Перед этим вы увидите предупреждение LOW MEMORY на консоли.

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

Скачать проект QuartzNightmare можно здесь

...