簡體   English   中英

UIView transitionWithView期間的枚舉突變

[英]Enumeration Mutation During UIView transitionWithView

我偶爾遇到我的iPhone應用程序崩潰的情況,並遇到以下異常

NSGenericException', reason: '*** Collection <CALayerArray: 0x26f6b0> was mutated while being enumerated.

隨着堆棧跟蹤在崩潰的線程

Thread 0 Crashed:
0   libSystem.B.dylib                   0x00078ac8 __kill + 8
1   libSystem.B.dylib                   0x00078ab8 kill + 4
2   libSystem.B.dylib                   0x00078aaa raise + 10
3   libSystem.B.dylib                   0x0008d03a abort + 50
4   libstdc++.6.dylib                   0x00044a20 __gnu_cxx::__verbose_terminate_handler() + 376
5   libobjc.A.dylib                     0x00005958 _objc_terminate + 104
6   libstdc++.6.dylib                   0x00042df2 __cxxabiv1::__terminate(void (*)()) + 46
7   libstdc++.6.dylib                   0x00042e46 std::terminate() + 10
8   libstdc++.6.dylib                   0x00042f16 __cxa_throw + 78
9   libobjc.A.dylib                     0x00004838 objc_exception_throw + 64
10  CoreFoundation                      0x0009f850 __NSFastEnumerationMutationHandler + 208
11  libobjc.A.dylib                     0x0000a51a objc_enumerationMutation + 18
12  UIKit                               0x00007bfe -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 142
13  UIKit                               0x00007c2e -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 190
14  UIKit                               0x00007cd2 -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:] + 22
15  UIKit                               0x00007628 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 304
16  UIKit                               0x000074e8 -[UIView(Hierarchy) addSubview:] + 16
17  UIKit                               0x0006c350 +[UIViewControllerWrapperView wrapperViewForView:frame:] + 232
18  UIKit                               0x00077d0c -[UINavigationController _startTransition:fromViewController:toViewController:] + 468
19  UIKit                               0x00077abc -[UINavigationController _startDeferredTransitionIfNeeded] + 176
20  UIKit                               0x00077a00 -[UINavigationController viewWillLayoutSubviews] + 8
21  UIKit                               0x0006dca8 -[UILayoutContainerView layoutSubviews] + 132
22  UIKit                               0x0000fbc0 -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] + 20
23  CoreFoundation                      0x0003e2e4 -[NSObject(NSObject) performSelector:withObject:] + 16
24  QuartzCore                          0x0000f942 -[CALayer layoutSublayers] + 114
25  QuartzCore                          0x0000f6fa CALayerLayoutIfNeeded + 178
26  QuartzCore                          0x000094c4 CA::Context::commit_transaction(CA::Transaction*) + 204
27  QuartzCore                          0x000092da CA::Transaction::commit() + 186
28  QuartzCore                          0x0002d9b6 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 46
29  CoreFoundation                      0x00030236 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 10
30  CoreFoundation                      0x000300aa __CFRunLoopDoObservers + 406
31  CoreFoundation                      0x000276b4 __CFRunLoopRun + 848
32  CoreFoundation                      0x00027270 CFRunLoopRunSpecific + 224
33  CoreFoundation                      0x00027178 CFRunLoopRunInMode + 52
34  GraphicsServices                    0x000045ec GSEventRunModal + 108
35  GraphicsServices                    0x00004698 GSEventRun + 56
36  UIKit                               0x0000411c -[UIApplication _run] + 396
37  UIKit                               0x00002128 UIApplicationMain + 664
38  iDriveGreen                         0x00003026 main (main.m:13)
39  iDriveGreen                         0x00002ff0 start + 32

執行以下代碼后,將觸發此崩潰。

StopRouteViewController *stopVC = [[StopRouteViewController alloc] init];   
[UIView transitionWithView:self.navigationController.view
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromLeft
                animations:^{
                    [self.navigationController pushViewController:stopVC animated:NO];
                }
                completion:NULL];
[stopVC release];

這對任何人來說都是公然的錯誤嗎? 我當前的想法是,要么與stopVC在被推送之前就被釋放相關,要么與NavigationController.view進行轉換同時將一個新的viewController推送到navigationController上。

由於這種情況僅偶爾發生,因此我想在進行潛在的修復之前要有一點信心。

是的,這是API的不正確用法。 -[UINavigationController pushViewController:animated:]自行處理動畫。 即使您將NO作為第二個參數傳遞,它仍然會操縱視圖層次結構,這就是導致崩潰的原因。

基本上,沒有必要像動畫那樣在動畫塊中調用-[UINavigationController pushViewController:animated:]。 如果要對控制器的按下進行動畫處理,請將YES作為第二個參數傳遞。

暫無
暫無

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

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