didSelectRowAtIndexPath的pushViewController

时间:2011-02-16 06:34:16

标签: iphone objective-c

我有以下代码:

- (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];

}

因此,当我点击该行时,它可以带来此表格视图。然后我按向后导航并选择另一行,然后应用程序崩溃。我试图在控制台中看到任何错误,但找不到任何错误。有什么问题?

4 个答案:

答案 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)

即使没有分配,你也总是在释放。