Сообщение отправлено освобожденному экземпляру ОЧЕНЬ ОЧЕНЬ ОШИБКА
Я использую Xcode 5.02 и IOS 7.04 и я искал долго и трудно решить эту досадную ошибку, и после многих часов отладки, я до сих пор не могу раздавить эту ошибку.
Поэтому я использую класс UIManagedDocument Helper для получения моих данных
+ (void)openDocument:(NSArray *)documentData {
NSString *documentName = documentData[0];
CompletionBlock completionBlock = documentData[1];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject];
NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success) {
completionBlock(document);
preparingDocument = NO;
};
if(!preparingDocument){
preparingDocument = YES;
if(!([fileManager fileExistsAtPath:[url path]])){
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForCreating
completionHandler:OnDocumentDidLoad];
} else if(document.documentState == UIDocumentStateClosed){
[document openWithCompletionHandler:OnDocumentDidLoad];
} else if (document.documentState == UIDocumentStateNormal) {
OnDocumentDidLoad(YES);
}
} else {
//Try till Document is Ready
[self performSelector:@selector(openDocument:)
withObject:documentData
afterDelay:0.5];
}
}
В моем контроллере представления я использую этот вспомогательный класс для получения доступа к моему ManagedObjectContext
- (void)updateContext{
[DocumentHelper openDocument:@[DOCUMENT_NAME, ^(UIManagedDocument *document) {
self.managedObjectContext = document.managedObjectContext;
}]];
}
И этот метод updateContext обычно вызывается при обновлении CoreData, например при добавлении или удалении новых элементов, однако этот метод также вызывается в (void) методе viewWillAppear и в блоке уведомлений, когда приложение находится на переднем плане (с использованием делегата приложения).)
Всякий раз, когда я помещаю приложение в фоновый режим и снова открываю приложение, приложение вылетает, говоря
*** -[UIManagedDocument _setInConflict:]: message sent to deallocated instance 0x1701b0ae0
Я использовал malloc и NSZombie Profile manager, но независимо от того, что эта ошибка похожа на бомбу замедленного действия. Ошибка возникает при случайном числе закрытий и повторного открытия приложения.
1 ответ
Я испытал ту же проблему сегодня.
* - [UIManagedDocument _setInConflict:]: сообщение отправлено освобожденному экземпляру 0x1701b0ae0
Это сообщение указывает, что ваш экземпляр UIManagedDocument был освобожден, но ему отправлено сообщение. Я решил проблему в своем проекте, объявив переменную документа как переменную уровня файла (вне метода), чтобы она не была выпущена слишком быстро, и установив ее на ноль только после того, как я ее использовал.
РЕДАКТИРОВАТЬ, чтобы ответить на вопрос: мое приложение проверяет и обновляет документ iCloud в делегате приложения. В моем файле AppDelegate.h у меня есть это:
@interface CSPAppDelegate : UIResponder <UIApplicationDelegate> {
BOOL iCloudAvailable;
NSMetadataQuery *_query;
CSPICloudDocument *doc; // <<< declare document variable here instead of in method
}
Документ создается в соответствующем методе. Единственная реальная разница между вашим кодом и тем, что я делаю, заключается в том, где я объявил переменную. Этого было достаточно, чтобы решить ту же ошибку для меня.