Desenrollarse a través de múltiples vistas utilizando una segue personalizada en iOS8 provoca EXC_BAD_ACCESS

Tengo una aplicación basada en storyboards, para la cual he creado segues personalizados, que utilizan un controller de animation personalizado que he creado.

Todo funciona bien cuando se retrocede / retrocede una pantalla a la vez. Sin embargo, cuando bash desenrollarme a través de una stack de pantallas (p. Ej., He seguido Primero-> Segundo-> Tercero y luego bash desenrollar Tercero-> Primero), obtengo un EXC_BAD_ACCESS (code=1) .

La documentation de Apple para UIViewController.dismissViewControllerAnimated ( https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/dismissViewControllerAnimated:completion 🙂 dice ese

Si presenta varios controlleres de vista en sucesión, creando así una stack de controlleres de vista presentados, llamar a este método en un controller de vista más bajo en la stack descarta su controller de vista secundario inmediato y todos los controlleres de vista por encima de ese elemento secundario en la stack. Cuando esto sucede, solo la vista superior se descarta de manera animada; cualquier controller de vista intermedia simplemente se elimina de la stack. La vista superior se descarta utilizando su estilo de transición modal, que puede diferir de los styles utilizados por otros controlleres de vista más bajos en la stack.

Por lo que entiendo esto, si llamo 'dismissViewControllerAnimated' en First, debería descartar Third utilizando su estilo de transición modal, y simplemente eliminar Second de la stack.

Por lo tanto, mi método UnwindSegue.perform es:

 - (void)perform { UIViewController *sourceViewController = self.sourceViewController; UIViewController *destinationViewController = self.destinationViewController; sourceViewController.modalPresentationStyle = UIModalPresentationFullScreen; sourceViewController.transitioningDelegate = self; [destinationViewController dismissViewControllerAnimated:YES completion:nil]; //Error occurs here } 

La última línea falla con el error EXC_BAD_ACCESS .

He cavado un poco (al habilitar zombies), y parece que UIViewController internamente tiene una reference débil a mi segue – FirstController.dismissViewControllerAnimated llamadas UIViewController._customAnimatorForDismissedController , que llama a methods en segue Second-> Third (que ya no existe).

¿Alguien tiene alguna idea sobre si este comportamiento se espera o si me equivoco? Todo funciona en iOS7.

ETA: logging de locking

 Incident Identifier: 821DC9AC-E1A1-4CCD-8A3F-718577C1634D CrashReporter Key: 35442db1a2bdce63197d4abe696619ca29fe9675 Hardware Model: iPad4,1 Process: TestProject [3792] Path: /private/var/mobile/Containers/Bundle/Application/B56179DF-3A3D-4C57-A5A0-910EF0BAEB8D/TestProject.app/TestProject Identifier: com.xyz.TestProject Version: 1 (1.0) Code Type: ARM-64 (Native) Parent Process: launchd [1] Date/Time: 2015-02-10 17:32:35.524 +0000 Launch Time: 2015-02-10 17:32:15.301 +0000 OS Version: iOS 8.1.2 (12B440) Report Version: 105 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000554fbeb8 Triggenetworking by Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libobjc.A.dylib 0x0000000197cd7bd0 objc_msgSend + 16 1 UIKit 0x000000018bb83c3c -[UIViewController _customAnimatorForDismissedController:] + 80 2 UIKit 0x000000018bb83a84 -[UIViewController _dismissViewControllerWithTransition:from:completion:] + 620 3 UIKit 0x000000018bb2c074 -[UIViewController dismissViewControllerWithTransition:completion:] + 948 4 UIKit 0x000000018bb2bc5c -[UIViewController dismissViewControllerAnimated:completion:] + 248 5 TestProject 0x00000001000cd768 -[XYZUnwindStoryboardSegue perform] (XYZUnwindStoryboardSegue.m:26) 6 UIKit 0x000000018ba90d30 -[UIApplication sendAction:to:from:forEvent:] + 92 7 UIKit 0x000000018ba79e44 -[UIControl _sendActionsForEvents:withEvent:] + 608 8 UIKit 0x000000018ba906cc -[UIControl touchesEnded:withEvent:] + 588 9 UIKit 0x000000018ba90358 -[UIWindow _sendTouchesForEvent:] + 696 10 UIKit 0x000000018ba898ac -[UIWindow sendEvent:] + 680 11 UIKit 0x000000018ba5cfa4 -[UIApplication sendEvent:] + 260 12 UIKit 0x000000018bcfbf54 _UIApplicationHandleEventFromQueueEvent + 14988 13 UIKit 0x000000018ba5b50c _UIApplicationHandleEventQueue + 1612 14 CoreFoundation 0x00000001872629e8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 20 15 CoreFoundation 0x0000000187261c8c __CFRunLoopDoSources0 + 260 16 CoreFoundation 0x000000018725fd3c __CFRunLoopRun + 708 17 CoreFoundation 0x000000018718d0a0 CFRunLoopRunSpecific + 392 18 GraphicsServices 0x00000001902f35a0 GSEventRunModal + 164 19 UIKit 0x000000018bac23bc UIApplicationMain + 1484 20 TestProject 0x00000001000ce7ec main (main.m:14) 21 libdyld.dylib 0x0000000198332a04 start + 0 Thread 1 name: Dispatch queue: com.apple.libdispatch-manager Thread 1: 0 libsystem_kernel.dylib 0x0000000198430c94 kevent64 + 8 1 libdispatch.dylib 0x0000000100141254 0x100130000 + 70228 2 libdispatch.dylib 0x0000000100132ef4 0x100130000 + 12020 Thread 2: 0 libsystem_kernel.dylib 0x000000019844bc78 __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x00000001984e5390 _pthread_wqthread + 988 2 libsystem_pthread.dylib 0x00000001984e4fa4 start_wqthread + 0