Йохен,
я вижу такое же поведение, как часть управляемой обработки объект контекста слияния (через mergeChangesFromContextDidSaveNotification :). Для «обновленных» объектов в информации о слиянии пользователя основные данные сбрасывают объект «локального» контекста, а затем выполняют слияние с объектом «удаленного» контекста.
Если, как часть didTurnIntoFault: обработка, я освобождаю свое неуправляемое свойство (что очень просто и точно соответствует KVO), появляется ошибка. Интересно, что это только происходит с «вложенными» неуправляемыми свойствами. У меня есть много других неуправляемых свойств как часть моих управляемых объектов, которые являются простыми объектами (NSNumber, NSString и т. Д.), И они могут быть выпущены как часть didTurnIntoFault: обработка без каких-либо проблем. Только когда в неуправляемом свойстве обнаруживаются свойства> = 2 уровня, я вижу проблему.
Я не уверен, что вы нашли решение или еще не было (мне было бы очень интересно узнать, как вы прогрессировали с этим), но я нашел обход. Я оставляю свое неуправляемое имущество, выделенное в поврежденном объекте, и освобождаю его только во время подготовки к редактированию.
-(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];
}
Я подозреваю, больше людей будут работать в этот вопрос, как все больше и больше приложений Основных данных выпускаются с поддержкой ICloud, которая требует такого рода объединение как часть обработки NSPersistentStoreDidImportUbiquitousContentChangesNotification. Либо это, либо мы выясним, что мы делаем неправильно :-).
Cheers, Michael.
Какую технику вы относите в документе? Я не мог найти ничего там, что относится к этой проблеме, за исключением, может быть, использования setKeys: triggerChangeNotificationsForDependentKey :, но это устарело. – Jochen