iphone:核心数据:NSManagedObjects和UITableView崩溃

时间:2011-10-09 10:56:56

标签: iphone uitableview core-data nsmanagedobject

这个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) ,无);“就是这样,没有其他错误消息。

为了尝试调试,我将这个简单的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 个答案:

答案 0 :(得分:1)

由于自动释放池刷新,看起来您的fetchedObjects实例变量已被释放。

NSManagedObjectContext的{​​{1}}方法会返回 自动释放的 -executeFetchRequest:error:实例,但您无法获得所有权,因此在执行到达NSArray方法时,自动释放池已被刷新,并且该对象已被释放,您现在有一个悬空指针。啊,经典。

当然,解决方案是将-tableView:cellForRowAtIndexPath:消息从发送-retain发送到您NSArray的返回-executeFetchRequest:error:

不要忘记在NSManagedObjectContext方法中向其发送-release条消息。

答案 1 :(得分:0)

问题似乎就在这一行

NSManagedObject * info3 = [fetchedObjects objectAtIndex:indexPath.row];

尝试使用

NSManagedObject * info3 = [fetchedObjects objectAtIndex:0];

因为您的UiTableViewCell计数和fetchedObjects计数在整个过程中应该相等。

如果它不匹配则会给你索引错误。