我开始使用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而崩溃。
真的可以使用一些指针。感谢工厂提前为您提供帮助!
马特
答案 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
对象,而不保留它。然后该对象死亡,任何访问它的尝试都会导致崩溃。