Сообщение отправлено освобожденному экземпляру ОЧЕНЬ ОЧЕНЬ ОШИБКА

Я использую 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
}

Документ создается в соответствующем методе. Единственная реальная разница между вашим кодом и тем, что я делаю, заключается в том, где я объявил переменную. Этого было достаточно, чтобы решить ту же ошибку для меня.

Другие вопросы по тегам