Jochen,
Такое же поведение я вижу как часть обработки слияния контекста управляемого объекта (через mergeChangesFromContextDidSaveNotification :). Для «обновленных» объектов в пользовательской информации слияния данные ядра нарушают работу объекта «локального» контекста, а затем выполняют слияние с объектом «удаленного» контекста.
Если в рамках обработки didTurnIntoFault: я освобождаю свое неуправляемое свойство (которое очень просто и определенно соответствует KVO), появляется ошибка. Интересно, что это только происходит с «вложенными» неуправляемыми свойствами. У меня есть много других неуправляемых свойств как часть моих управляемых объектов, которые являются простыми объектами (NSNumber, NSString и т. Д.), И они могут быть освобождены как часть didTurnIntoFault: обработка без каких-либо проблем. Только когда свойства> = 2 уровня глубины наблюдаются внутри неуправляемого свойства, я вижу проблему.
Я не уверен, нашли ли вы решение или нет (мне было бы очень интересно услышать, как вы продвинулись в этом), но я нашел обходной путь. Я оставляю свое неуправляемое свойство выделенным в поврежденном объекте и освобождаю его только во время prepareForDeletion.
-(void) performInventoryItemObjectSetup
{
if ([self unitsManager] == nil) {
[self setUnitsManager:[[[BTUnitsManager alloc] init] autorelease]];
}
...
}
-(void) performInventoryItemObjectCleanup
{
...
}
/********************/
-(void) awakeFromInsert
{
//NSLog(@"InventoryItem: awakeFromInsert");
[super awakeFromInsert];
[self performInventoryItemObjectSetup];
}
-(void) awakeFromSnapshotEvents:(NSSnapshotEventType)flags
{
//NSLog(@"InventoryItem: awakeFromSnapshotEvents: 0x%lx", flags);
[super awakeFromSnapshotEvents:flags];
if (flags & NSSnapshotEventUndoDeletion) {
[self performInventoryItemObjectSetup];
}
}
-(void) awakeFromFetch
{
//NSLog(@"InventoryItem: awakeFromFetch");
[super awakeFromFetch];
[self performInventoryItemObjectSetup];
}
-(void) didTurnIntoFault
{
//NSLog(@"InventoryItem: didTurnIntoFault");
[self performInventoryItemObjectCleanup];
[super didTurnIntoFault];
}
-(void) prepareForDeletion
{
NSLog(@"InventoryItem: prepareForDeletion");
[self setUnitsManager:nil];
[super prepareForDeletion];
}
Я подозреваю, что все больше людей столкнется с этой проблемой, поскольку все больше и больше приложений Core Data выпускаются с поддержкой iCloud, которая требует такого слияния как часть обработки NSPersistentStoreDidImportUbiquitousContentChangesNotification. Либо так, либо мы узнаем, что делаем неправильно: -).
Cheers,
Майкл.