gpt4 book ai didi

iphone - CoreData DetailTableView BAD_ACCESS 错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:27 24 4
gpt4 key购买 nike

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

基本上,我使用 CoreData 来填充 TableView 的数据。它检索所有实体的所有标题属性。当用户单击一行时,我有一个详细 View 需要显示该实体的描述。我想我需要在我的 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 下载我的项目.

最佳答案

通常,使用核心数据支持的主从接口(interface),您不需要获取详细信息 View 。

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

通讯录应用就是一个很好的例子。主 TableView 将是联系人对象列表(显示名称)。当您选择一行时,主 TableView Controller 获取与所选行关联的特定联系人对象,然后将其传递给详细信息 View Controller ,然后填充详细信息使用从传递的 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 文件中读取 View 时才会调用该方法。这只能保证发生一次,因为当用户切换到另一个 View 时, View 可能保留在内存中。相反,将每次 View 出现时需要运行的代码放在 viewWillAppear 中。

关于iphone - CoreData DetailTableView BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com