CoreData DetailTableView BAD_ACCESS错误

时间:2011-08-11 23:23:03

标签: iphone ios xcode core-data exc-bad-access

也许我不打算使用CoreData显示所选行的详细信息,但我无法弄清楚为什么我收到“BAD_ACCESS”错误。我用Google搜索,无法找到我要找的东西。

基本上我使用CoreData来填充表视图的数据。它检索所有实体的所有标题属性。当用户点击一行时,我有一个详细信息视图,需要显示该实体的描述。我想我需要在DetailViewController中为新的NSFetchRequest创建一个新的NSManagedObjectContext和一个新的NSEntityDescription,然后使用NSPredicate来说“where title = [user selected title]”。我选择一行时出错。见代码:

- (void)viewDidLoad
{
    // Do any additional setup after loading the view from its nib.

    // Get the objects from Core Data database
    Caregiver_Activity_GuideAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription
                                              entityForName:@"Definition"
                                              inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(title = %@)", self.title];
    [request setPredicate:pred];

    NSError *error;
    NSArray *objects = [context executeFetchRequest:request error:&error];
    if (objects == nil) {
        NSLog(@"There was an error!");
        // Do whatever error handling is appropriate
    }

    for (NSManagedObject *oneObject in objects) {
        [definitionDescriptionTextView setText:[oneObject valueForKey:@"desc"]];
    }

    [objects release];
    [request release];

    [super viewDidLoad];
}

我注释掉代码,一切正常。但是当我尝试使用断点进行调试时,没有任何东西可以捕获。所以我更困惑。

我知道CoreData对我正在做的事情可能有点过分但这对我来说是一个学习应用程序。

编辑:我没有提到我正在使用预先填充了实体的sqlite数据库。

您也可以在my github page下载我的项目。

1 个答案:

答案 0 :(得分:1)

通常,使用Core Data支持的Master-Detail界面,您无法获取Detail视图。

在主表视图中选择行时,您正在选择特定的托管对象实例。然后,将该托管对象实例传递给详细信息视图。无需重新获取在tableview中选择的对象。

一个很好的例子就是Contacts应用程序。主表视图将是联系人对象的列表(显示名称。)当您选择一行时,主表视图控制器获取与所选行关联的特定联系人对象,然后将其传递给详细信息视图控制器,然后填充详细信息使用从传递的Contact对象的属性获取的数据进行查看。

因此,不需要发生错误的整个代码块。

但是,此代码中的即时错误是您正在释放未创建的对象。在这一行:

 NSArray *objects = [context executeFetchRequest:request error:&error];

...您没有使用initnewcreate方法创建NSArray实例。相反,您只是接收由context NSManagedObjectContext实例创建并返回的自动释放的NSArray实例。当您释放未在此处创建的对象时:

 [objects release];

...你导致崩溃。

相反,您可以在此处创建NSFetchRequest:

 NSFetchRequest *request = [[NSFetchRequest alloc] init];

...因为您使用了init所以您必须与以下内容保持平衡:

[request relwase];

顺便说一句,这种类型的代码不应该放在viewDidLoad中,因为只有在第一次从磁盘上的nib文件中读取视图时才调用该方法。这仅保证发生一次,因为当用户切换到另一个视图时视图可能保留在内存中。相反,每当视图出现在viewWillAppear中时,都需要运行代码。