这个fetch方法工作得很好,NSLog打印出数据库的内容...(NSArray中的fetchedObjects):
NSError *error2;
fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error2];
if (!fetchedObjects) {
NSLog(@"Error %@",[error2 localizedDescription]);
}
for (NSManagedObject *info in fetchedObjects) {
NSLog(@"Name: %@", [info valueForKey:@"Name"]);
NSLog(@"Description: %@", [info valueForKey:@"Description"]);
NSLog(@"Ingredients: %@", [info valueForKey:@"Ingredients"]);
..但是当我尝试填充tableView时(我已经构建了很多表并且感觉我对它们的工作原理有很好的了解),程序崩溃了一个“EXE_BAD_ACCESS at int retVal = UIApplicationMain(argc,argv,nil,nil) ;“ . 就是这样,没有其他错误消息 .
为了尝试和调试,我将这个简单的NSLog放在“cellForRowAtIndexPath”方法中,但它在NSLog崩溃(@“tableched%i中的fetchedObjects count”,[fetchedObjects count]) .
据我所知,我还没有发布阵列 .
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.
NSLog(@"fetchedObjects count in tableview %i",[fetchedObjects count]);
NSManagedObject *info3 = [fetchedObjects objectAtIndex:indexPath.row];
NSLog(@"Name: %@", [info3 valueForKey:@"Name"]);
cell.textLabel.text = [info3 valueForKey:@"Name"];
2 回答
问题似乎就在这条线上
NSManagedObject * info3 = [fetchedObjects objectAtIndex:indexPath.row];
尝试使用
NSManagedObject * info3 = [fetchedObjects objectAtIndex:0];
因为您的UiTableViewCell计数和fetchedObjects计数在整个过程中应该相等 .
如果它不匹配则会给你索引错误 .
看起来你的
fetchedObjects
实例变量因为自动释放池刷新而被释放 .NSManagedObjectContext
的-executeFetchRequest:error:
方法返回一个 autoreleasedNSArray
实例,你没有获得所有权,因此当执行到达-tableView:cellForRowAtIndexPath:
方法时,自动释放池已被刷新,并且该对象被释放,你现在有一个悬空指针 . 啊,经典 .当然,解决方案是将
-retain
消息发送到返回的NSArray
,从发送-executeFetchRequest:error:
到NSManagedObjectContext
.不要忘记在
-dealloc
方法中向其发送-release
消息 .