- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
也许我不打算使用 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];
...您不是使用 init
、new
或 create
方法创建 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/
在我的应用程序中,我有两个表格 View 。第一个 TableView 具有固定数量的单元格。这些单元格将始终相同且永远不会更改上面的表格 View 将始终包含 4 个单元格,不再有更多单元格。在我的
也许我不打算使用 CoreData 显示选定行的详细信息,但我无法弄清楚为什么我会收到“BAD_ACCESS”错误。我用谷歌搜索,找不到我要找的东西。 基本上,我使用 CoreData 来填充 Tab
我是一名优秀的程序员,十分优秀!