Отвечая на didReceiveMemoryWarning странность - PullRequest
1 голос
/ 23 августа 2010

Итак, у меня есть карта с наложенной кучей MKPolygonViews. Когда я надеваю пару, он немного пыхтит, а затем, если я помещаю их все в системы, отправляет didReceiveMemoryWarning системе, на которую я ответил, удаляя оверлеи.

Теперь мне стало интересно, сколько памяти фактически используется, когда это происходит, это всего лишь 10 МБ реальной памяти и 100 МБ виртуальной памяти. Приложение SMS в то время использовало 30 МБ памяти и работало нормально. Есть и другие приложения, такие как почта, использующая больше, чем мое приложение. SpringBoard поднимается на 5 МБ, поэтому ничего особенного. Это также работает на iPhone 4, так что должно быть достаточно памяти (мои расчеты около 256 МБ все еще свободны).

После удаления оверлеев отпечаток памяти уменьшается только на 1 МБ, при повторном включении он увеличивается на 1 МБ, поэтому ничего необычного.

Так что же происходит? Предупреждение о памяти исходит из графической памяти или чего-то еще? Его производительность с этими оверлеями ограничена графическим процессором? Когда все они включены, при перемещении используется около 60%, но это не объясняет плохую производительность.

Любое направление к ответу будет оценено.

РЕДАКТИРОВАТЬ: Springboards Виртуальная память увеличивается до 450 МБ с включенными оверлеями и, как только она достигает 512 МБ, отправляет предупреждение памяти. Это является причиной проблемы? Общий объем виртуальной машины всегда превышает 512 МБ, поэтому он должен использовать флэш-память для виртуальной машины и, следовательно, не должен вызывать предупреждение о памяти

Ответы [ 3 ]

1 голос
/ 17 сентября 2010

Решение было объединить все MKPolygonViews в один MKpolygonView.Дополнительную информацию можно найти здесь

0 голосов
/ 11 октября 2010

Одна вещь, которую я заметил, это то, что простого удаления оверлеев (например, mkpolygon) из вида карты недостаточно. По крайней мере, двух вещей не происходит ...

  1. Это не освобождает всю память
  2. Не полностью очищается наложение от вида карты

Это вызывает ряд проблем, особенно если вы потенциально работаете с несколькими большими оверлеями. Я сделал несколько вещей, чтобы противостоять этому.

  1. Я не смог втиснуть их всех в один MKPolygonView или «MultiPolygonView», как предложено в публикации AppleDevForum, потому что я нацеливаюсь на iOS 3.2, что исключает создание подклассов этих классов «только для iOS 4» ... вы все равно можете их использовать в 3.2 просто не подкласс их
  2. Решил, что из-за очень большого количества координат в моих многоугольниках я ограничиваю число на экране в любое время двумя. Так уж сложилось, что для моего приложения это было подходящим ожиданием. Поэтому я сохраняю два многоугольных вида как свойства для моего контроллера вида карты и использую их по мере необходимости.
  3. Всякий раз, когда мне нужно освободить память (часто!) Или когда мне нужно изменить полигоны, я сначала аннулирую соответствующее представление многоугольника paths с помощью вызова [polygonView invalidatePath]. Только после этого я сбрасываю свойство polygonview, а затем удаляю наложения с вида карты (перед их повторным созданием при необходимости).

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

Если есть лучший, более эффективный способ сделать все это, я, конечно, открыт для предложений!

0 голосов
/ 23 августа 2010

Вероятно, вам следует оптимизировать этот код, отображая только те виды наложений, которые действительно видны на текущей карте.Нет смысла добавлять наложения для области карты, на которую не смотрит пользователь.

...