选择同一行两次时UITable崩溃

时间:2011-01-26 22:10:05

标签: iphone memory uitableview

我有一个UITableView,当一行调用didSelectRowAtIndexPath时,它会完美切换到下一个视图。但是,当我单击“后退”按钮然后选择之前选择的同一行时......我的应用程序崩溃了。如果我选择不同的行,它不会崩溃。这是代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSDictionary *tempEventDictionary = [[NSDictionary alloc]initWithDictionary:[arrayWithEvents objectAtIndex:indexPath.row]];
    NSLog(@"%i",tempEventDictionary);


    //push to new view and set myArray in the cardPage
    CardPageViewController *cardPageViewController = [[CardPageViewController alloc] init];
    cardPageViewController.eventDictionary = tempEventDictionary;
    [self presentModalViewController:cardPageViewController animated:YES];

    [cardPageViewController release];   
    [tempEventDictionary release];
}

“EXC_BAD_ACCESS”消息崩溃。

正如您所看到的,我正在打印NSDictionary的指针地址,它似乎正在为每个indexPath.row寻找相同的地址。这意味着正在释放指针位置,当我尝试将其重新分配给相同indexPath.row的值时,正在搜索旧指针地址,但它不存在。也许我在这里完全错了。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

您发布的代码没有明显错误。我的猜测是你在CardPageViewController内的某个地方过度释放了你的一个数据对象,然后当你的代码再次尝试从相同的数据创建一个临时字典时,它会在字典中遇到一个dealloced对象,那就是崩溃发生了。

答案 1 :(得分:0)

我有一个“hack”的答案,在保留计数一直向下进行这种难以捉摸的自动释放之前保持对象存活。我初始化字典,然后设置它使保留计数变为2,隐藏(对我的眼睛)自动释放不会使程序崩溃。这是代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

//---send data to cardPage

CardPageViewController *cardPageViewController = [CardPageViewController alloc];

NSDictionary *tempEventDictionary = [[NSDictionary alloc]initWithDictionary:[arrayWithEvents objectAtIndex:indexPath.row]];
cardPageViewController.eventDictionary = [arrayWithEvents objectAtIndex:indexPath.row];

[self presentModalViewController:cardPageViewController animated:YES];
[cardPageViewController release];
}

我希望这可以帮助那些找不到这本已发布词典的人。

答案 2 :(得分:0)

为什么不创建一个自定义init来获取字典,然后将字典复制到新视图控制器的自定义init中呢?