私は全く同じ問題を抱えています。これは、十分にテストされておらず、アップルのコードにバグを引き起こすpopoverからモーダルビューコントローラを提示しているという事実によって引き起こされたようです。バグは、UIKitは、既に解除されている割り当て解除されたView Controllerへの保持されていない参照を保持するため、後でその参照がヒットします。私の回避策は、モーダル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(@"-------");}];
}
このコードは、それはそれが#3のUIViewControllerさらに別の観点から提示され、それ自体別のUIViewController#2からオーバーポップさUIPopoverController、内部にある、のUIViewController#1の一部です。クラッシュはポップオーバーが閉じられた後に発生し、コントローラ#2は却下されました。
私はゾンビを有効にした場合、私は同じスタックトレースを取得しますが、メッセージを持つ:だから
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秒後に解雇され、割り当て解除、およびAppleのコードのどこかでまだまだぶら下がっている参照です。ポップオーバーがクローズされ、VC#2が却下されると、すべてが解放されて、割り当てられていないVCにアクセスしようとしている。私はAppleのバグだと確信しています。私はそれがポップオーバーからVCを提示することに関連していると推測しています。
同じ問題の別のスタックトレースはこれです。上記のコードを2回実行すると、次のようになります。
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
実際に面白いです。私の場合は、別のモーダルビューコントローラからモーダルビューコントローラを提示しています。あなたは同じ問題だと思いますか?彼らは常に正しい順序で割り当て解除されますが、あなたが言っていることに基づいて、誰かが最初のモーダルコントローラでヒットキャンセルを言うと、すぐにクラッシュを引き起こす可能性のある元のモーダルコントローラでキャンセルを押すでしょうか? –
私はそれが同じことだと思います - VCがAppleのシステムのどこかに詰まっています。 – DenNukem