发送到解除分配的实例的消息非常严重错误

时间:2014-01-21 22:00:13

标签: ios objective-c core-data memory-management uimanageddocument

我正在使用Xcode 5.02和iOS 7.04,我一直在寻找解决这个令人讨厌的bug的问题很长,经过几个小时的调试后,我仍然无法压制这个bug。

所以我正在使用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管理器,但不管这个bug是什么样的定时炸弹。关闭并重新打开应用程序的随机次数发生错误。

1 个答案:

答案 0 :(得分:2)

我今天遇到了同样的问题。

* - [UIManagedDocument _setInConflict:]:发送到解除分配的实例0x1701b0ae0的消息

此消息表明您的UIManagedDocument实例已被解除分配,但正在向其发送消息。我通过将文档变量声明为文件级变量(在方法之外)来解决我的项目中的问题,以便它不会过于仓促释放,并且在我使用它之后仅将其设置为nil。

编辑回答问题: 我的应用程序从应用程序委托中的iCloud文档检查和更新。在我的AppDelegate.h文件中,我有这个:

@interface CSPAppDelegate : UIResponder <UIApplicationDelegate> {
    BOOL iCloudAvailable;
    NSMetadataQuery *_query;
    CSPICloudDocument *doc; // <<< declare document variable here instead of in method
}

文档在相关方法中实例化。你的代码与我正在做的事情之间唯一真正的区别就是我已经声明了变量。这足以为我解决同样的错误。