6

このクラッシュレポートを数回見ました。それは非常にランダムでまれであり、私には理解できません。私がしているのは、次のコードを使用してモーダルビューコントローラーを提示することだけです

ComposeController *newcontrol = [[ComposeController alloc]initWithMode:1 withNIB:@"ComposeController"];
newcontrol.delegate = self;

UINavigationController  *holder = [[UINavigationController alloc] initWithRootViewController:newcontrol];
[self presentViewController:holder animated:YES completion:NULL];

どういうわけか、これは完全にランダムにこれにつながります:

OS Version:      iPhone OS 6.1 (10B143)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x9
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x3b25c5d0 objc_msgSend + 16
1   CoreFoundation                      0x334ba73f -[__NSPlaceholderArray initWithObjects:count:] + 271
2   CoreFoundation                      0x334bae09 +[NSArray arrayWithObject:] + 45
3   UIKit                               0x353e80ab -[UIWindow _rotationViewControllers] + 51
4   UIKit                               0x353e7fe3 -[UIViewController viewControllerForRotation] + 91
5   UIKit                               0x353e7f39 -[UIViewController _visibleView] + 97
6   UIKit                               0x3546c05b -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 2483
7   UIKit                               0x3546afab -[UIViewController presentViewController:withTransition:completion:] + 3399
8   MyApp                               0x00046e97 -[Inbox composeHit] (Inbox.m:207)
4

2 に答える 2

5

私はまったく同じ問題を抱えています。これは、私がポップオーバーからモーダルビューコントローラーを提示しているという事実が原因のようです。これは十分にテストされておらず、Appleのコードのバグを引き起こします。バグは、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(@"-------");}];
}

このコードは、UIViewController#1の一部であり、UIPopoverController内にあり、別のUIViewController#2からポップオーバーされます。これは、それ自体がさらに別のビューUIViewController#3から提示されます。ポップオーバーが閉じられ、コントローラー#2IDが閉じられた後にクラッシュが発生します。

ゾンビを有効にすると、同じスタックトレースが表示されますが、次のメッセージが表示されます。

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を提示することに関連していると思います。そのため、ポップオーバーから離れている場合、または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
于 2013-03-14T03:31:47.663 に答える
-3

これをやってみてください

[ホルダーpushViewController:newcontrolアニメーション:YES完了:NULL];

于 2013-02-19T21:40:34.450 に答える