Управление памятью основных данных - PullRequest
9 голосов
/ 14 ноября 2009

Я прочитал разделы по управлению памятью в документации по основным данным, и я все еще немного сбит с толку. У меня есть один контекст в моем приложении, и у меня есть несколько вещей, извлекающих из него объекты. Например, несколько извлеченных контроллеров результатов, подробные представления и некоторый другой код, выбирающий случайные объекты. Как только объекты будут полностью освобождены, а их количество сохранений равно 0, будут ли базовые данные автоматически освобождать всю информацию об объектах и ​​вызывать их ошибку?

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

Большое спасибо,

Mike

Ответы [ 2 ]

12 голосов
/ 15 ноября 2009

Базовые данные управляют временем жизни объекта так же, как и остальная часть Какао управляет временем жизни объекта: экземпляры NSManagedObject в контексте управляемого объекта сохраняются в памяти до тех пор, пока контекст управляемого объекта или любой другой объект сохраняет право собственности на их (через -[NSObject retain]. По умолчанию NSManagedObjectContext не сохраняет экземпляры, поэтому они освобождаются, как только другие владельцы (т.е. ваши NSFetchedResultsController экземпляры или другие экземпляры в вашей программе) выпускают их. Вы можете изменить это Поведение контекста управляемого объекта по умолчанию для сохранения экземпляров, но вы редко этого хотите. Контекст управляемого объекта имеет для сохранения экземпляров, которые обновляются до следующего сохранения. Нет способа сохранить эти изменения, кроме объекта экземпляра до тех пор, пока контекст не будет сохранен. Таким образом, чтобы минимизировать использование памяти объектами Core Data, следуйте стандартным правилам: освободите их как можно скорее. Если вы обнаружите, что использование контекстной памяти растет (используйте инструменты Core Data инструментов для отслеживания это), за исключением т Он будет чаще использовать контекст, если вы обновляете экземпляры и, следовательно, сохраняете их в контексте до следующего сохранения, даже если вы их иным образом выпустили.

Использование NSFetchedResultsController делает все это проще. Фактически, причина существования NSFetchedResultsController заключается в том, чтобы облегчить программисту пакетную выборку в среде с низким объемом памяти (например, в iPhone).

Как упоминал Луи, NSPersistentStoreCoordinator поддерживает кэш строк для кэширования данных экземпляра в памяти вместо того, чтобы возвращаться на диск при сбое объекта в контексте управляемого объекта. Однако это деталь реализации Базовых данных (хотя ошибки в кэше снижают производительность; вы можете отслеживать ошибки в инструментах). Core Data управляет кеш-памятью, и вам не нужно об этом беспокоиться.

4 голосов
/ 14 ноября 2009

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

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

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