帮助NSFetchedResultsController

时间:2010-02-15 21:29:41

标签: objective-c cocoa-touch xcode

请帮助解决使用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];
}

请帮助我理解为什么代码在那里打破。 感谢任何建议。

2 个答案:

答案 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];