0

ViewControllerAViewControllerB使用模态 segue打开。

ViewControllerA

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    // ModalSegue is defined in the storyboard to point to ViewControllerB
    [self performSegueWithIdentifier:@"ModalSegue" sender:self];
}

ViewControllerB

- (IBAction)cancelButtonTapped:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil]; // Causes crash
}

在 iOS 7.1 中,这会导致 EXC_BAD_ACCESS 崩溃。如果 Zombie Objects 被打开,它会抛出异常:

*** -[ViewControllerB respondsToSelector:]: message sent to deallocated instance 0x12ed7e170

在 iOS 7.0 中,这按预期工作。

有任何想法吗?

编辑:根据 LeoNatan 的要求,这里是dealloc方法的堆栈跟踪ViewControllerB

堆栈跟踪

4

1 回答 1

6

正如聊天中所讨论的,问题是选择器视图的寿命比其视图控制器长,导致它尝试向其委托发送消息。

nil解决方法是在方法中设置picker view的delegate和data source dealloc

在 iOS 7 及更高版本中,将委托和数据源设置为 被认为是一种很好的做法nil,因为视图的生命周期比它们的视图控制器更长,并且在它们发布后尝试访问它们的委托。

于 2014-03-14T01:40:34.723 回答