Использование памяти CoreData: различия между iOS 5 и iOS 4.3? - PullRequest
0 голосов
/ 05 декабря 2011

У меня были проблемы с памятью в универсальном приложении для iOS: CoreData использовала слишком много памяти (> 30 месяцев). Таким образом я сделал все возможное, чтобы уменьшить объем используемой памяти.

В основном моя модель CoreData является базовой моделью каталога:

  • категории высокого уровня (сущность с ограниченными двоичными данными <10K) </li>
  • каждая категория имеет ~ 10 подкатегорий (сущность с ограниченными двоичными данными <10K) </li>
  • каждая подкатегория имеет ~ 10 товаров (опять же, ограниченные двоичные данные <10K) </li>
  • каждый продукт имеет ~ 10 подробных изображений (с большим количеством данных: ~ 40-70K)

После того, как каждый предмет (включая изображения) был освобожден, я делаю

[NSManagedObjectContext refreshObject: item mergeChanges: NO];

вызов для уменьшения графа в памяти (чтобы пропустить изображения)

С iOS 5+ все работает очень хорошо, но с iOS 4.3 я получаю много ошибок.

Иногда ошибка:

Завершение приложения из-за необработанного исключения «NSObjectInaccessibleException», причина: «NSManagedObject с ID: 0xbb70480 был признан недействительным. '

В других случаях приложение закрывается из-за «исключения обработчика», и нет подробностей о том, что пошло не так.

Мои вопросы:

  • Есть идеи, почему поведение отличается от iOS 5 и iOS 4.3?
  • Любая рекомендация о том, что я мог бы сделать, чтобы уменьшить объем памяти, используемый CoreData? (кроме освобождения контроллеров выборки и освобождения контекстов, которые больше не используются)

1 Ответ

3 голосов
/ 16 декабря 2011

Трудно сказать конкретные различия в использовании памяти с вашей моделью в разных версиях iOS. По моему опыту, хранение изображений в основном хранилище данных работает не особенно хорошо. Как правило, вы хотите данные изображения в памяти только при необходимости. Каждая из ваших категорий содержит ~ 4-7 МБ данных изображения, поэтому вам не понадобится слишком много категорий, прежде чем вы столкнетесь с проблемами. То, что я сделал в своем приложении, - это сохранение данных изображения на диске и сохранение имени файла в магазине. Изображение загружается только при необходимости для отображения, и оно высвобождается, когда больше не нужно. Это делает магазин маленьким, а выборки быстрыми.

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

РЕДАКТИРОВАТЬ: больше информации о том, почему хранение данных изображения в базовых данных плохо

Другая проблема с использованием основных данных для хранения данных изображений заключается в том, что загрузка и сохранение данных, даже если они выполняются только при необходимости, занимают нетривиальное время и блокируют ваш основной поток во время загрузки. Где бы вы ни хранили данные изображения, вы хотите загружать их из фона. Это просто, если вы используете хранилище файлов. При использовании основных данных реализуйте логику загрузки / сохранения фонового изображения, которая создает новый контекст, загружает / сохраняет данные изображения. При загрузке необходимо передать данные в основной поток, чтобы можно было создавать / отображать UIImage.

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