Управление памятью с использованием Core Data в среде Cocoa, Mac OS, iOS

Cocoa

Экземпляр данных и жизненный цикл

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

NSEntityDescription предоставляет удобный метод insertNewObjectForEntityForName:inManagedObjectContext: для создания нового управляемого объекта и вставки его в редактируемый контекст. Поскольку имя метода не начинается со слова "new", в среде подсчета ссылок вы не владеете возвращаемым объектом.

Роль контекста управляемого объекта

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

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

Исключением из этого правила является то, что контекст управляемого объекта поддерживает сильные (strong) ссылки на (в среде подсчета ссылок он сохраняет) любое измение (вставка, удаление, и обновление) объектов, пока он в ожидании транзакции (на save:) или отбрасываются (с reset или rollback).

Вы можете изменить поведение контекста по умолчанию так, что он сохранит свои управляемые объекты, отправив ему сообщение setRetainsRegisteredObjects: (с аргументом YES)-это делает жизнь управляемых объектов зависящей от контекста. Это может оказаться удобным, если вы кэшируете небольшие наборы данных в памяти, например, если контекст управляет временным набором объектов, которые могут сохраняться за один цикл событий, например, при редактировании в таблице. Это может также быть полезно, если вы используете несколько потоков и передачу данных между ними, например, если вы выполняете фоновую выборку и передаете идентификаторы объектов в основной поток. Фонового потока должна сохранить объекты, которые он предварительно выбрал для основного потока пока он не узнает, что основной поток фактически использовал идентификаторы объектов.

Вы должны обычно использовать отдельный контейнер, чтобы сохранить только те управляемые объекты, которые действительно нужны. Вы можете использовать массив или словарь, или объект контроллера (например NSArrayController), которые явно сохраняют объекты, которыми они управляют. Управляемые объекты, не нужно будет освобождать, при первой-же необходимости (например, когда отношения будут удалены).

Если вы закончили работу с контекстом управляемого объекта, или по какой-то другой причине вы хотите, чтобы "отключить" контекст от его координатора постоянного хранилища, вы не должны устанавливать координатор контекста в nil:

// Данный код возбудит исключение
[myManagedObjectContext setPersistentStoreCoordinator:nil];

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

Прерывание циклов подсчета ссылок

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

Изменения и Менеджер отмены

Управляемые объекты, которые находятся в ожидании изменения (вставки, удаления и обновления) сохраняются своими контекстами, пока их контекст отправляет save:, reset, rollback или dealloc сообщение, или соответствующее количество отмен, чтобы отменить изменения.

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

Если вы не собираетесь использовать функциональность отмены Core Data, вы можете уменьшить ресурсы требований приложения, установив менеджер отмены контекста в nil. Это может быть особенно полезно для фоновых потоков, а также для большого импорта или пакетных операций.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac