也许我不打算使用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下载我的项目。
答案 0 :(得分:1)
通常,使用Core Data支持的Master-Detail界面,您无法获取Detail视图。
在主表视图中选择行时,您正在选择特定的托管对象实例。然后,将该托管对象实例传递给详细信息视图。无需重新获取在tableview中选择的对象。
一个很好的例子就是Contacts应用程序。主表视图将是联系人对象的列表(显示名称。)当您选择一行时,主表视图控制器获取与所选行关联的特定联系人对象,然后将其传递给详细信息视图控制器,然后填充详细信息使用从传递的Contact对象的属性获取的数据进行查看。
因此,不需要发生错误的整个代码块。
但是,此代码中的即时错误是您正在释放未创建的对象。在这一行:
NSArray *objects = [context executeFetchRequest:request error:&error];
...您没有使用init
,new
或create
方法创建NSArray实例。相反,您只是接收由context
NSManagedObjectContext实例创建并返回的自动释放的NSArray实例。当您释放未在此处创建的对象时:
[objects release];
...你导致崩溃。
相反,您可以在此处创建NSFetchRequest:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...因为您使用了init
所以您必须与以下内容保持平衡:
[request relwase];
顺便说一句,这种类型的代码不应该放在viewDidLoad
中,因为只有在第一次从磁盘上的nib文件中读取视图时才调用该方法。这仅保证发生一次,因为当用户切换到另一个视图时视图可能保留在内存中。相反,每当视图出现在viewWillAppear
中时,都需要运行代码。