2014-03-14 105 views
0

ViewControllerA使用模態segue打開ViewControllerBdismissViewControllerAnimated僅在iOS 7.1中導致EXC_BAD_ACCESS

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崩潰。如果殭屍對象被打開它拋出異常:

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

在iOS系統7.0,此按預期工作。

任何想法?

編輯:由於每LeoNatan的要求,這裏的dealloc法在ViewControllerB堆棧跟蹤:

Stack Trace

+0

您使用ARC嗎?從消息你可以看到你的ViewControlllerB實例已被過度釋放。 – nielsbot

+0

儀器可以幫助您使用分配儀器進行跟蹤。 – nielsbot

+0

爲'ViewControllerB'實現'dealloc'方法並在那裏設置一個斷點。查看誰發佈了您的視圖控制器。在這裏發佈堆棧跟蹤。 –

回答

6

如在聊天討論的,問題是具有比其視圖控制器更長的壽命一個選擇器視圖,導致它嘗試向其代表發送消息。

解決的辦法是在dealloc方法中將選取器視圖的委託和數據源設置爲nil

對於iOS 7及更高版本,將代表和數據源設置爲nil是一種很好的做法,因爲視圖的壽命比視圖控制器的壽命更長,並且在它們發佈後嘗試訪問它們的代表。

+0

感謝您的支持!你會鏈接到一些資源,可能是蘋果的一個資源,確認你的良好實踐建議? – epologee

+1

@epologee不知道我是否能找到具體的東西。問題是,視圖控制器比其視圖層次結構更早發佈。這是因爲Apple將視圖層次結構移動到另一個動畫視圖,因此它被保留在控制器之外。 –

相關問題