请帮助解决使用NSFetchedResultsController的问题。
我创建了NSFetchedResultsController的一个对象,我在方法中使用了一次:tableView:cellForRowAtIndexPath:
当我尝试在方法tableView:didSelectRowAtIndexPath:
中执行相同的代码时,我得到EXC_BAD_ACCESS
。
以下是2种方法的代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
Person *person = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = person.name; //This works fine
[person release];
return cell;
}
这是有问题的片段:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
PhotoListViewController *photoListViewController = [[PhotoListViewController alloc] initWithNibName:@"PhotoListViewController" bundle:nil];
//The next line returns a bad object or undefined memory
Person *person = [fetchedResultsController objectAtIndexPath:indexPath];
//causing the call of [person name] to return EXC_BAD_ACCESS
photoListViewController.person = [person name];
[self.navigationController pushViewController:photoListViewController animated:YES];
[photoListViewController release];
[person release];
}
请帮助我理解为什么代码在那里打破。 感谢任何建议。
答案 0 :(得分:3)
Person *person = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = person.name; //This works fine
[person release];
[person release]
是问题 - 如果不在那里分配,则无需释放人员。这导致person
被过度释放,导致其他东西试图访问它时崩溃。
答案 1 :(得分:1)
即使在这个例子中,可以操作一个自动释放的对象(由于操作的简单性,即你只是抓住* person的一个属性),正确的方法是保留你的Person对象并释放它最后:
Person *person = [[fetchedResultsController objectAtIndexPath:indexPath] retain];
// bla bla
[person release];