我有以下代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
if (tvc == nil)
tvc = [[TopicViewController alloc] initWithNibName:@"TopicViewController" bundle:nil];
tvc.title = @"Topic";
tvc.topicId = [[results objectAtIndex:indexPath.row] objectForKey:@"id"];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:tvc animated:YES];
[tvc release];
}
因此,当我点击该行时,它可以带来此表格视图。然后我按向后导航并选择另一行,然后应用程序崩溃。我试图在控制台中看到任何错误,但找不到任何错误。有什么问题?
答案 0 :(得分:3)
我相信你的(tvc == nil)返回NO,因为你发布了tvc但没有将它设置为nil所以下次访问这个方法时,你试着将它作为一个视图控制器推送而不再分配它,因此崩溃。
您可以删除if (tvc == nil)
支票或发布tvc,然后使用[tvc release], tvc = nil;
将其设为nil。
另一种可能性是你的results
数组正在发布。它在哪里初始化并且您为它声明了保留属性?如果是这样,您可以使用[self.results objectAtIndex:...]
访问它,这将保证它会一直存在,直到您的视图控制器被取消分配。
答案 1 :(得分:0)
假设tvc
是保留对象的声明属性,请执行
self.tvc = [[TopicViewController alloc] initWithNibName:@"TopicViewController" bundle:nil];
//....
self.tvc = nil;
[tvc release];
而不是
tvc = [[TopicViewController alloc] initWithNibName:@"TopicViewController" bundle:nil];
//....
[tvc release];
但是,我不会释放视图控制器并重新分配它,因为内存分配很昂贵。我只是存储一个tvc对象并重新使用它,通过根据所选行修改它。
答案 2 :(得分:0)
@Equinox我认为你需要做这样的事情
tvc.title = [[NSString alloc] initWithFormat:@"Topic"];
tvc.topicId = [[NSString alloc] initWithString:[[results objectAtIndex:indexPath.row] objectForKey:@"id"]];
编辑:我认为你过度发布了TopicViewController
课程中的一些对象,因此你的应用程序在控制台中的任何消息都会崩溃。您可以做的是构建和分析您的项目以检查任何过度释放的对象
答案 3 :(得分:0)
即使没有分配,你也总是在释放。