我的問題非常一致。這似乎是由於我正在從彈出窗口展示模式視圖控制器,而這並未經過充分測試,並觸發了Apple代碼中的錯誤。錯誤在於UIKit保留了一個對我的視圖控制器的未被引用的引用,這個引用已經被解散和釋放,所以在稍後的時間引用這個引用。我的解決方法是避免從彈出窗口中顯示模態VC,或者無限期地保留所有此類VC(在成員變量或某些類型中)。
下面是血淋淋的細節。
這是我用來觸發問題的代碼。
-(void) handlePinchFromCell:(AMPSupportingPhotoCell*) cell
{
UIViewController * vc = [[UIViewController alloc] init]; // UIViewController #0
[self presentViewController:vc animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:vc afterDelay:2];
}
-(void) dismiss:(UIViewController*)vc
{
[self dismissViewControllerAnimated:YES completion:^(){NSLog(@"-------");}];
}
此代碼是一個UIViewController#1的一部分,這是一個UIPopoverController內部,從另一個的UIViewController#2,其是本身從又另一個3視圖的UIViewController#所呈現彈出過來。崩潰發生後關閉,控制器#2 id被解散。
如果我讓殭屍,我會得到相同的堆棧跟蹤,但有一個消息:
2013-03-13 20:04:24.681 Mercury[16698:19d03] handlePinchFromCell: a225710
2013-03-13 20:04:27.083 Mercury[16698:19d03] -------
2013-03-13 20:04:31.606 Mercury[16698:19d03] *** -[UIViewController retain]: message sent to deallocated instance 0xa225710
所以,注意到VC#0得到分配,提出了釋放,辭退2秒後,竟然有仍然是蘋果代碼中的一個懸而未決的參考。當popover關閉並且VC#2被解僱時,整個事情就會崩潰,試圖訪問釋放的VC。我相當肯定這是蘋果的錯誤。我也猜想這與從一個popover展示一個VC有關,所以如果你遠離那個,或者自己保留VC,你應該沒問題。
同一個問題的另一個堆棧跟蹤是這樣的。它發生如果上面的代碼運行兩次:
2013-03-13 20:12:53.883 Mercury[16735:19d03] handlePinchFromCell: 16d54da0
2013-03-13 20:12:56.285 Mercury[16735:19d03] -------
2013-03-13 20:13:03.481 Mercury[16735:19d03] handlePinchFromCell: a2565f0
2013-03-13 20:13:03.481 Mercury[16735:19d03] *** -[UIViewController isKindOfClass:]: message sent to deallocated instance 0x16d54da0
(lldb) bt
* thread #1: tid = 0x1f03, 0x017f8a97 CoreFoundation`___forwarding___ + 295, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
frame #0: 0x017f8a97 CoreFoundation`___forwarding___ + 295
frame #1: 0x017f894e CoreFoundation`_CF_forwarding_prep_0 + 14
frame #2: 0x00c42f90 UIKit`-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 907
frame #3: 0x00a40ee3 UIKit`-[UIViewController presentViewController:withTransition:completion:] + 4521
frame #4: 0x00a41167 UIKit`-[UIViewController presentViewController:animated:completion:] + 112
frame #5: 0x0006c32d Mercury`-[AMPSupportingPhotosViewController handlePinchFromCell:](self=0x16d55360, _cmd=0x0007a64a, cell=0x0a22a2a0) + 205 at AMPSupportingPhotosViewController.m:184
frame #6: 0x015336b0 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #7: 0x0006f317 Mercury`-[AMPSupportingPhotoCell handlePinch:](self=0x0a22a2a0, _cmd=0x00efb0db, sender=0x0a2504a0) + 215 at AMPSupportingPhotoCell.m:53
frame #8: 0x00c2185a UIKit`_UIGestureRecognizerSendActions + 139
確實有趣。在我的情況下,我從另一個模態視圖控制器呈現模態視圖控制器。你認爲同樣的問題?他們總是按照正確的順序釋放,但是根據你所說的話,似乎如果有人說在第一個模態控制器上點擊取消,然後在原始模態控制器上迅速取消可能觸發崩潰的取消? – 2013-03-15 05:00:51
我認爲這是一回事 - 一個VC陷入蘋果系統的某個地方。 – DenNukem 2013-03-18 20:58:18