簡體   English   中英

iOS dismissModalViewController導致EXC_BAD_ACCESS

[英]iOS dismissModalViewController results in EXC_BAD_ACCESS

調用dismissModalViewController會間歇性地導致EXC_BAD_ACCESs。

間歇性與特定構建有關,而不是特定的構建。 也就是說,如果已編譯可執行文件,則調用將始終通過或始終失敗。

它似乎並不依賴於代碼是否在構建之間發生了變化。

我們正在使用iPhone 5.1模擬器和安裝了iOS 5.1的iPod touch第4代。 此行為存在於模擬和物理設備中

誰看過這個嗎? 我們的智慧結束了。

以下是模態視圖控制器的顯示位置以及它被解除的位置:

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

如果有更好的方法可以為您格式化,請告訴我。

我遇到的問題(與此症狀相同)原來是(經過一整天的調試!)以下情況:

1)視圖控制器A呈現(使用presentViewController:animated:completion :)視圖控制器B.

2)視圖控制器B保持對參見控制器A(委托參考)的弱引用。

3)視圖控制器B在視圖控制器A上執行一種方法,作為副作用,解除視圖控制器A.

4)視圖控制器B嘗試使用以下方式解除自身:

[self dismissViewControllerAnimated:NO completion:completion];

跟蹤此問題的部分困難源於步驟3)異步。 步驟4)正在發生,步驟3)尚未完成。 即,視圖控制器B在步驟4)中被解除分配。

當你運行類似的東西:

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

在一個塊內並運行如下:

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

在塊之外,不可能知道首先運行哪行代碼。 有時它將是dismissViewControllerAnimated:,其他時候它將是presentModalViewController:。

如果dismissViewControllerAnimated:先運行,那么viewController可能會被釋放,所以當應用程序試圖運行presentModalViewController時:它正在向一個不再存在的對象發送消息,這可能是導致崩潰的原因。

祝好運!

嘗試保存2個強指針:一個指向PaymentStack viewController,一個指向“self”。 它將有助於發現誰被摧毀。 為每個viewControllers添加“ - (void)dealloc”方法,並為這些方法添加斷點。 它將有助於發現破壞點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM