Iphone 核心数据关系无法加载到一个关系

Iphone 核心数据关系无法加载到一个关系,iphone,objective-c,cocoa-touch,core-data,Iphone,Objective C,Cocoa Touch,Core Data,我在文档和设置模型之间有一对一的关系: 创建文档时,将创建相应的设置对象。模型被持久化到核心数据 创建几个文档(以及关联设置)后重新启动时,应用程序将使用以下方法重新加载要选择的文档列表: // Load delegate from shared application and context from delegate. SampleAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; NSManagedO

我在文档和设置模型之间有一对一的关系:

创建文档时,将创建相应的设置对象。模型被持久化到核心数据

创建几个文档(以及关联设置)后重新启动时,应用程序将使用以下方法重新加载要选择的文档列表:

// Load delegate from shared application and context from delegate.
SampleAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext;

// Create new request.
NSFetchRequest *request = [[NSFetchRequest alloc] init];

// Create entity description using delegate object context.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:context];

// Set entity for request.
[request setEntity:entity];

// Load array of documents.
NSError *error;
NSArray *documents = [context executeFetchRequest:request error:&error];

// Rlease descriptor.
[descriptor release];

// Release request.
[request release];

// Done.
return documents;
列表显示良好(文档正在加载)。但是,当尝试访问程序退出的任何文档的设置时,会给出:

程序收到信号:“SIGABRT”

当用户选择按钮时,会触发对设置的修改。奇怪的是,如果在加载时返回文档之前添加了以下代码段(即,如果在加载时访问了关系),则程序不会崩溃:


关系的属性为“(非原子,保留)”并使用“@dynamic”。有什么想法吗?谢谢

在核心数据模型中,是否在文档和设置之间设置了反向关系?如果没有,则必须。

在核心数据模型中,是否在文档和设置之间设置了反向关系?如果没有,你必须这样做。

在这个bug上花了太多时间之后,我终于找到了答案。在值的初始加载过程中,我设置了KVO。此代码导致崩溃崩溃(尽管它们直到下一次运行循环才出现):


我不知道为什么会出现这个问题,但我很幸运,现在能够简单地删除它。

在这个bug上花了太多时间后,我终于找到了答案。在值的初始加载过程中,我设置了KVO。此代码导致崩溃崩溃(尽管它们直到下一次运行循环才出现):


不知道为什么会出现问题,但我很幸运,现在可以简单地将其删除。

您是否与僵尸一起运行?代码看起来不错,我怀疑是内存管理问题。@martin,我对XCode性能工具不太熟悉,但当我选择“运行>使用性能工具运行”时,僵尸变灰了。我需要做什么特别的事情才能使用它?Thank.NSZombie enabled description here:我建议您将代码发布到实际崩溃的地方。它可能像打字一样简单。你和僵尸一起跑了吗?代码看起来不错,我怀疑是内存管理问题。@martin,我对XCode性能工具不太熟悉,但当我选择“运行>使用性能工具运行”时,僵尸变灰了。我需要做什么特别的事情才能使用它?Thank.NSZombie enabled description here:我建议您将代码发布到实际崩溃的地方。它可以像打字错误一样简单。
for (Document *document in documents)
{
    NSLog(@"document.name: %@", document.name);
    NSLog(@"document.settings.stroke: %@", document.settings.stroke);
    NSLog(@"document.settings.stroke: %@", document.settings.stroke);
}
[self.document.settings addObserver:self forKeyPath:@"fill" options:0 context:NULL];
[self.document.settings addObserver:self forKeyPath:@"stroke" options:0 context:NULL];