Ответ 1
Основные данные используют обратные отношения и правила удаления, чтобы поддерживать согласованный граф объекта.
Скажем, у вас есть A.foo <1 > 1 > B.bar и do a.foo = b
. Это автоматически (эффективно) выполняет b.bar = a
.
Теперь скажем, что вы [b delete]
. При правиле "nullify" эффективно b.bar.foo = nil
. С "каскадом" оно [b.bar delete]
. Без "действия" он ничего не делает; a.foo
теперь является "оборванной ссылкой на объект основных данных".
Это не настоящий оборванный указатель; стандартные правила управления памятью означают, что b
будет по-прежнему существовать в памяти, пока a
указывает на него (пока a
не превратится в ошибку), но a.foo
будет навсегда ссылаться на удаленный объект, что вызывает исключение, когда вы попробуйте получить доступ к его свойствам. Я не уверен, что происходит, когда вы сохраняете и повторно выбираете a
.
С отношением "многие-ко-многим" он становится более сложным. Детали реализации: отношения, по-видимому, "принадлежат" одному из сущностей и сохраняются только тогда, когда этот объект сохраняется (я ударил эту ошибку при попытке установить отношения между разными MOC: MOC, который был сохранен, не принадлежал обновленный объект, поэтому отношения никогда не сохранялись). Очевидно, что когда вы удаляете как a
, так и b
, отношения также должны быть удалены, поэтому предполагается, что связь исчезает, только один из них удаляется (но вы не знаете, какой из них).
Вероятно, вам нужен Nullify или Cascade. Я никогда не использую Cascade, потому что я никогда не могу вспомнить, в каком направлении происходит каскадирование.