2011-10-09 82 views
0

这完全取方法的工作和NSLog的打印出数据库中的内容...(在一个NSArray fetchedObjects):iphone:核心数据:NSManagedObjects和UITableView的崩溃

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(我已经建立了很多表并感觉我对它们的工作原理有了很好的理解),程序崩溃时出现了“int retVal = UIApplicationMain(argc,argv,nil,nil)的EXE_BAD_ACCESS ;.”就是这样,没有其他错误信息。我试图调试,我把这个简单的NSLog放在“cellForRowAtIndexPath”方法中,但它在NSLog(@“fetchedObjects count = tableview%i”,[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"]; 
+0

numberOfRowsInSection中的行数是多少?在哪个方法中你正在初始化fetchedObjects? –

+0

嗨Praveen。我使用'return [ArrayNameHere count];'目前它是27.这意味着数组在那里......!?! – Jeremy

回答

1

看起来像你的fetchedObjects实例变量由于autorelease池刷新而被释放。

NSManagedObjectContext-executeFetchRequest:error:方法返回自动释放NSArray实例,该实例你没有获得的所有权,因此由时间执行到达-tableView:cellForRowAtIndexPath:方法,所述自动释放池被刷新,而该对象被释放,你现在有一个悬挂指针。啊,经典。

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

不要忘记在您的-dealloc方法中发送-release消息。

+0

谢谢雅各布。我将fetchObjects复制到另一个数组中:'displayArray = [NSArray arrayWithArray:fetchedObjects];'并打印出内容(一切正常)。我在调用表reloaddata [displayArray count]之前检查这个数组,这个工作非常棒。改变tableView指向这个新的数组,它仍然崩溃在NSLog的NSLog(@“displayArray计数在tableview%我”,[displayArray计数]);'我甚至手动创建另一个数组,并指出tableView在那个确定表正在工作(而且是)。为了以防万一,我还多次清理了这个项目。 – Jeremy

+0

终于搞定了。我应该将'fetchedObjects'复制到一个新的数组中,所以:'displayArray = [fetchedObjects mutableCopy];'似乎正在使用'[NSArray arrayWithArray:fetchedObjects]'复制数组''不正确。谢谢你的帮助。 – Jeremy

+0

@Jeremy创建副本比调用'-retain'更贵。你应该真正做我告诉你的,不要复制。这是不必要的开销。 –

0

这个问题似乎是在这条线

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

尝试使用

NSManagedObject * INFO3 = [fetchedObjects objectAtIndex:0];

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

如果它不匹配,那么它会给你索引错误。