Потому что он не удаляется:)
Если [folder documentObject]
возвращает ноль, это просто означает, что между этими двумя объектами нет никакой связи. Это не значит, что объект удален из основных данных.
Попробуйте это:
[[doc managedObjectContext] deleteObject:doc];
EDIT
Используя этот код, я проверил вашу проблему:
Я создал новый проект с объектом Document and Folder в Core Data - для него задана папка << -> document с каскадом, установленным для отношения папки.
// Create a document and folder and save them
Folder *fol = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:[self managedObjectContext]];
Document *doc = [NSEntityDescription insertNewObjectForEntityForName:@"Document" inManagedObjectContext:[self managedObjectContext]];
[doc setFolder:fol];
[[self managedObjectContext] save:nil];
// Get the document's object id for later
NSManagedObjectID *documentId = [doc objectID];
// Delete the relationship
[fol removeDocumentsObject:doc];
[[self managedObjectContext] save:nil];
// Try to reload the document to see if it's still there
Document *doc2 = (Document *)[[self managedObjectContext] objectWithID:documentId];
// Get a property from the document - this will fault if the document has been deleted. Otherwise it
// will work.
NSLog(@"%@", doc2);
NSLog(@"%@", [doc2 title]);
// Now delete specifically and try again
[[self managedObjectContext] deleteObject:doc];
[[self managedObjectContext] save:nil];
// Should get a fault here
doc2 = (Document *)[[self managedObjectContext] objectWithID:documentId];
NSLog(@"%@", doc2);
NSLog(@"%@", [doc2 title]);
Первые два оператора NSLog работают правильно - я получаю описание документа и строку для заголовка.
Вторые операторы NSLog аварийно завершают работу, поскольку документ больше не существует в хранилище.
Это говорит мне о том, что простого удаления отношения недостаточно для удаления Документа из хранилища - вы должны явно удалить его. Однако вы говорите, что думаете, что он удален. Можете ли вы опубликовать запрос, который вы выполняете, чтобы увидеть, находится ли он еще в магазине или нет?