didSelectRowAtIndexPath生成EXC_BAD_ACCESS,而willSelectRowAtIndexPath工作正常UITableView

时间:2010-08-05 11:23:11

标签: iphone uitableview

我开始使用iPhone开发,并且在编写UITableView时遇到一些问题,UITableView是常规UIViewController的子部分。

问题:

当点击一行时,didSelectRowAtIndexPath生成一个EXC_BAD_ACCESS(我已经检查了正确的方法签名。然而,如果我将此方法的主体移动到willSelectRowAtIndexPath它可以正常工作。这对我来说似乎是错误的,因为所有的文档/模式使用didSelectRowAtIndexPath。好吧,这真的很奇怪是该方法是否被调用。当然如果没有记录下面的日志输出,那么该方法没有运行,所以我可以把任何编译的代码放在那里,它就不会那么为什么会出现异常?另外我发现很难确认它与过早发布的对象有关,因为程序在移动到willSelectRowAtIndexPath时执行正常。也许在意志之间有一些对象(重新)分配并做了阶段?

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        CommentViewController *commentViewController = [[CommentViewController alloc] initWithNibName:@"CommentViewController" bundle:nil];
        Comment *selectedComment = [[Comment alloc] init];
        selectedComment = [self.message.comments objectAtIndex:indexPath.row];
        commentViewController.comment = selectedComment;

        [self presentModalViewController:commentViewController animated:YES];

        [selectedComment release];
        [commentViewController release];    
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NSLog(@"This method is never called ... as I don't see this log output ... ");
}

设置:

UITableView作为IB中的元素创建,并作为UIViewController中的引用变量连接。 UIViewController被设置为UITableView的数据源和委托。到目前为止一切顺利,UIViewController视图加载,UITableView正确加载了单元格。这意味着数据源的委托方法至少可以正常工作。

下一步:

所以现在我想点击一行并加载另一个视图(无论是模态还是其他,现在都没关系)和BOOM,模拟器因控制台中报告的EXC_BAD_ACCESS而崩溃。

真的可以使用一些指针。感谢工厂提前为您提供帮助!

马特

1 个答案:

答案 0 :(得分:3)

在上面的代码中永远不会调用

didSelectRowAtIndexPath,因为你在willSelectRowAtIndexPath:中唤起了一个模态视图,它冻结了tableview并阻止它向其委托/数据源发送消息。

以下是导致崩溃的原因:

    Comment *selectedComment = [[Comment alloc] init]; // creates new object 
    selectedComment = [self.message.comments objectAtIndex:indexPath.row]; // assigns a different existing object. Newly created object never used and leaking
    commentViewController.comment = selectedComment; // set to assigned existing

    [self presentModalViewController:commentViewController animated:YES];

    [selectedComment release] // BINGO! you release the assigned object 

您的崩溃是由上面的BINGO线引起的。您将初始化的Comment对象与从数组返回的另一个完全不相关的Comment对象混淆。您释放从数组返回的Comment对象,而不保留它。然后该对象死亡,任何访问它的尝试都会导致崩溃。