Сохранение контекста CoreData не логически связано с выпуском NSManagedObject
.
В большой программе достаточно часто иметь контекст управляемого объекта (moc) во время работы вашей программы.Объекты добавляются и удаляются из контекста, отражающего действия пользователя, и контекст также время от времени сохраняется, так что контекст в памяти синхронизируется с тем, что имеется в файле.Но в этом случае сохранение контекста не означает, что вы закончили с контекстом;вы по-прежнему сохраняете контекст и используете его так же, как и до сохранения.Таким образом, сохранение не означает освобождение объектов.
Итак, если вы хотите освободить сохраняемые объекты, вам необходимо явно освободить их.
Однако в этом случае insertNewObjectForEntityName:inManagedObjectContext:
возвращает автоматически освобожденный объект как написано здесь .Таким образом, вы не являетесь владельцем объекта, если не сохраните его явно.Если вы не сохранили, вы не должны выпускать его.Он выпущен, и dealloc
вызывается автоматически при необходимости.
Обратите внимание, что вам никогда не следует полагаться на retainCount
, чтобы увидеть, что происходит.Для упрощенного объекта число retainCount
согласуется с тем, что мы ожидаем, но для чего-то сложного, такого как NSManagedObject
, сама структура должна отслеживать множество вещей, и поэтому может делать много retain
за кулисами.Например, даже если вы явно не сохраняете объект, он может быть связан с другим объектом, которым вы владеете;или CoreData может просто решить сохранить объект в памяти для его кэширования.
Единственное, что нужно иметь в виду, это придерживаться стандартного правила собственности.Если вы alloc/init
или retain
, вы позже release
или autorelease
это.
Отвечая на ваш вопрос в комментарии, позвольте мне изложить здесь основной принцип: если объект x
нуждается в другом объекте a
, x
retain
s a
.Когда x
заканчивается, используя a
, x
release
s a
.Каждый объект x
должен следовать этой процедуре, независимо от того, является ли x
объектом, который вы кодируете, или который предоставляет инфраструктура Apple.Если каждый объект следует этому принципу, утечки нет.Итак, код Apple, который вы не видите, следует за этим.Ваш код также должен следовать этому.
Это отвечает на ваш вопрос:
когда я «добавляю» дочерний объект к родительскому, родительский объект автоматически сохраняет добавленный мной объект?
Да, это так.Родитель нуждается в этом, поэтому он сохраняет его.
И если я затем освобождаю родительский объект, он освободит дочерний элемент или мне придется сделать это явно?
Да, родитель освобождает дочернего элемента, потому что, когда родитель dealloc
ed, он заканчивает использование дочернего элемента, поэтому дочерний элемент release
ed.
Эти пункты обычно не пишутся в документации отдельных методов, потому что, как правило, каждый API следует этому базовому принципу управления памятью, и, следовательно, нет необходимости их разъяснять.
Рекомендуем прочитать Правила управления памятью .