2012-03-28 8 views
3

dismissModalViewControllerを呼び出すと、間欠的にEXC_BAD_ACCESが発生します。iOS dismissModalViewControllerの結果はEXC_BAD_ACCESS

間欠性は、特定の実行ではなく特定のビルドに関連しています。つまり、実行可能ファイルがコンパイルされている場合、呼び出しは一貫して成功するか、一貫して失敗します。

ビルド間でコードが変更されているかどうかには依存していないようです。

iOS 5.1搭載のiPhone 5.1シミュレータとiPod touch 4th genを使用しています。この現象は、シミュレートされたデバイスと物理デバイスの両方に存在します

これまでに見たことがありますか?私たちはウィットの終わりにいる。

はここでどこモーダルビューコントローラを提示しますだの両方だけでなく、それは却下されます。ここで

PaymentStack* paymentStack = 
[[PaymentStack alloc] initWithOrder:[anOrderManager thisOrder] locationState:[appData locationState] 
         successBlock:^{ 
          //Push the current order on the history list 
          [[appData ordersHistory] addObject:[anOrderManager thisOrder]]; 
          if ([[anOrderManager thisOrder] isEffectivelyEqual:[anOrderManager thisOrder]]) 
          { 
           //Allocate a new order 
           [anOrderManager setOrder:[[Order alloc] init]]; 
          } 
         } 
        completionBlock:^{ 

         [self dismissViewControllerAnimated:YES 
               completion:^{ 
                NSLog(@"Complete."); 
               }]; 
        } 
        cancellationBlock:^{ 
         [self dismissViewControllerAnimated:YES 
               completion:^{ 
                NSLog(@"Cancellation."); 
               }]; 
        }]; 
[self presentModalViewController:[paymentStack navigationController] animated:YES]; 

は、ここでスタックトレースです:

#0 0x00d659ab in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:]() 
#1 0x00b4ea9c in -[UIViewController _dismissViewControllerWithTransition:from:completion:]() 
#2 0x00b4df91 in -[UIViewController dismissViewControllerWithTransition:completion:]() 
#3 0x00b4ec81 in -[UIViewController dismissViewControllerAnimated:completion:]() 
#4 0x00071135 in __35-[MasterViewController placeOrder:]_block_invoke_0186 at /Users/jake/Documents/Avocado/AvocadoTest1.0/MasterViewController.m:258 
#5 0x000515c0 in __91-[PaymentStack initWithOrder:locationState:successBlock:completionBlock:cancellationBlock:]_block_invoke_0() 
#6 0x000545c8 in __27-[PaymentStack showSuccess]_block_invoke_0230() 
#7 0x000558cc in -[PaymentCompleteViewController done]() 
#8 0x01a47e99 in -[NSObject performSelector:withObject:withObject:]() 
#9 0x00a8214e in -[UIApplication sendAction:to:from:forEvent:]() 
#10 0x00cc0a0e in -[UIBarButtonItem(UIInternal) _sendAction:withEvent:]() 
#11 0x01a47e99 in -[NSObject performSelector:withObject:withObject:]() 
#12 0x00a8214e in -[UIApplication sendAction:to:from:forEvent:]() 
#13 0x00a820e6 in -[UIApplication sendAction:toTarget:fromSender:forEvent:]() 
#14 0x00b28ade in -[UIControl sendAction:to:forEvent:]() 
#15 0x00b28fa7 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]() 
#16 0x00b28266 in -[UIControl touchesEnded:withEvent:]() 
#17 0x00aa73c0 in -[UIWindow _sendTouchesForEvent:]() 
#18 0x00aa75e6 in -[UIWindow sendEvent:]() 
#19 0x00a8ddc4 in -[UIApplication sendEvent:]() 
#20 0x00a81634 in _UIApplicationHandleEvent() 
#21 0x03dd9ef5 in PurpleEventCallback() 
#22 0x01a1a195 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__() 
#23 0x0197eff2 in __CFRunLoopDoSource1() 
#24 0x0197d8da in __CFRunLoopRun() 
#25 0x0197cd84 in CFRunLoopRunSpecific() 
#26 0x0197cc9b in CFRunLoopRunInMode() 
#27 0x03dd87d8 in GSEventRunModal() 
#28 0x03dd888a in GSEventRun() 
#29 0x00a7f626 in UIApplicationMain() 
#30 0x000025ed in main at /Users/jake/Documents/Avocado/AvocadoTest1.0/AvocadoTest1/main.m:16 

私はこれをフォーマットすることができ、より良い方法があればあなたのために、私に知らせてください。ブロック内

[self dismissViewControllerAnimated:YES 
         completion:^{ 
            NSLog(@"Complete."); 
            }]; 

とのようなものを実行します:

+1

あなたのコードを表示してください。 – WrightsCS

+0

さて、私はあなたのためにそれを投稿するつもりです。 – jknielse

+1

スタックトレースを表示してください。ゾンビやスタティックアナライザーでプロファイラを実行しようとしましたか? –

答えて

1

は、あなたのような何かを実行すると、それは最初に実行されるコードのどの行を知ることは不可能だブロックの

[self presentModalViewController:[paymentStack navigationController] animated:YES]; 

外側を。時にはdismissViewControllerAnimated :,それはpresentModalViewController:になることもあります。

dismissViewControllerAnimated:が最初に実行された場合、アプリケーションがpresentModalViewControllerを実行しようとすると、viewControllerがおそらくdeallocされている可能性があります。これは、もはや存在しなくなり、おそらくクラッシュの原因になっているオブジェクトにメッセージを送ります。

幸運を祈る!

+0

これは間違いなく良い推測ですが、残念ながら、コールバックブロックはビューコントローラとのやり取りを伴うUIイベントによってトリガされます。これらのビューは、ビューの表示が終了した場合にのみ発生します。 – jknielse

1

私は(これと同じ症状を)持っていた問題は、(デバッグの固体日後!)であることが判明し、以下の状況:

1 presentViewControllerを使用して)表示コントローラAのプレゼント(:アニメーション:完了ビューコントローラB.

2)ビューコントローラBは、ビューコントローラA(デリゲート参照)に対して弱い参照を保持します。

3)表示制御部Bは、副作用として、

4)表示コントローラBが使用してそれ自体を却下しようとビューコントローラAを解放し、ビューコントローラAのメソッドを実行する:

[self dismissViewControllerAnimated:NO completion:completion]; 

これを追跡することの難しさの一部は、ステップ3)が非同期であることから生じました。ステップ4)が発生しており、ステップ3)はまだ完了していない。すなわち、ビューコントローラBは、ステップ4)の途中で割り当て解除された。

0

2つの強力なポインタを保存してください:1つはPaymentStack viewControllerに、もう1つは「self」に保存してください。誰が破壊されたのかを検出するのに役立ちます。 すべてのviewControllersに対して「 - (void)dealloc」メソッドを追加し、これらのメソッドにブレークポイントを追加します。それは破壊のポイントを検出するのに役立ちます。

関連する問題