2013-03-27 72 views
0

我正在与核心数据的年龄。目前我想了解更多关于UIManagedDocument的信息。我已经做了几个示例项目来了解更多。最后,我很高兴把这个机制转移到真正的项目上。在现有项目中,我目前正在实施核心数据,所以我创建了数据模型(与应用程序名称相同)。我为一个实体生成了一个类,然后创建了一个具有向数据库添加对象的简单方法的类。最后,我创建了UIManagedDocument单身,现在它看起来是这样的:NSCFString _cfurl无法识别的选择器发送到实例

+ (MDManagedDocument *)sharedDocument { 
    static dispatch_once_t dispatchOncePredicate; 
    __strong static MDManagedDocument *md = nil; 
    dispatch_once(&dispatchOncePredicate, ^{ 
     md = [[MDManagedDocument alloc] init]; 
    }); 
    return md; 
} 

- (id)init { 
    self = [super init]; 
    if(self) { 
     [self setManagedDocument:[[UIManagedDocument alloc] initWithFileURL:[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"ThisIsDatabase"]]]; 
     [[self managedDocument] setPersistentStoreOptions:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]];   
    } 
    return self; 
} 

- (void)prepareManagedDocument { 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[[[self managedDocument] fileURL] path]]) { 
     [[self managedDocument] saveToURL:[[self managedDocument] fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { 
      if (success) { 
       NSLog(@"Managed document was created."); 
      } else { 
       NSLog(@"Error occured while creating managed document."); 
      } 
     }]; 
    } else if([[self managedDocument] documentState] == UIDocumentStateClosed) { 
     [[self managedDocument] openWithCompletionHandler:^(BOOL success) { 
      if (success) { 
       NSLog(@"Managed document was opened."); 
      } else { 
       NSLog(@"Error occured while opening managed document."); 
      } 
     }]; 
    } else if([[self managedDocument] documentState] == UIDocumentStateNormal) { 
     NSLog(@"Managed document is opened and prepared for editing and/or reading."); 
    } 
} 

我实例共享实例并调用prepareManagedDocument方法将其与此消息后崩溃:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString _cfurl]: unrecognized selector sent to instance 0xb3774b0' 

有趣的是,它只在第一次运行时崩溃,但由于这次崩溃,它不会创建一个持久存储,所以它将无法写入文档等。我有一个项目正在使用此代码,并且不会抛出任何异常,因此它正在创建持久性存储,我可以写入这个文档。

我在哪里错了?

在此先感谢!

+2

看起来你有一个过早的释放问题,并且一个NSString正在填充将响应该内部消息的对象所在的空间。打开僵尸,并调用malloc_stack。 – CodaFi 2013-03-27 19:27:45

+0

@CodaFi我启用了他们两个+我在乐器中使用Zombies Trace帮助我的应用程序,没有得到任何有用的信息。顺便说一下,在第二次运行时,当它试图打开文档时,它会记录我在处理文档打开的块中实现的错误消息。 – 2013-03-27 19:40:43

+0

@CodaFi让我尝试在设备上运行它。 – 2013-03-27 19:43:52

回答

0

问题解决!我有一个扩展NSURL的类,并且只有一个方法baseURL,在我删除这个类或者重命名方法一切正常。

相关问题