App que bloquea el dispositivo completo en Segue para iOS 9 + Xcode 7

ACTUALIZACIÓN: He usado uno de mis DTS durante el año en esto. Actualmente trabaja con un ingeniero de soporte de Apple. Sobre su sugerencia, también he creado un informe de errores para esto. Actualizaré este hilo a medida que pase el time, lo que dará como resultado una solución FINAL.

De alguna manera, he descubierto una forma de crear una aplicación que literalmente reinicia un simulador y / o un dispositivo físico. Hurra por mi Este problema comenzó cuando me actualicé a xcode 7 y comencé a probar con iOS 9. En CUALQUIER dispositivo / simulador <iOS 9, este problema no avanza su cabeza fea.

Cuando lo ejecuto conectado a Xcode, los únicos posts de logging que veo son

XPC connection interrupted Terminating since there is no system app. 

Lo he networkingucido a una sección de código que llama

 [self addChildViewController:segue.destinationViewController]; 

Este código es una parte de un "MultichildContainerViewController" creado en el estilo de este controller de vista

En este punto, simplemente no sé dónde search / hacer para solucionar este problema. Si comento la adición del control childview, todo está bien y la aplicación funciona normalmente. Si NO lo comento, reiniciará todo mi simulador.

¿Alguna idea sobre dónde encontrar información de debugging adicional o correcciones potenciales? Simplemente no sé dónde mirar este punto para encontrar más información que a su vez usar para pedir ayuda. Cualquier ayuda es apreciada, gracias.

EDIT: No sé si esto ayuda, pero pude encontrarlo en el sistema iOS Simulator.log. ¿No parece tener references a mi propia base de código, solo tablero?

 Oct 16 17:56:29 MyComputer backboardd[43977]: -[NSNull isEqualToString:]: unrecognized selector sent to instance 0x10de1baf0 Oct 16 17:56:29 MyComputer backboardd[43977]: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x10d e1baf0' *** First throw call stack: ( 0 CoreFoundation 0x000000010dbf6f65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010df82deb objc_exception_throw + 48 2 CoreFoundation 0x000000010dbff58d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 3 CoreFoundation 0x000000010db4cf7a ___forwarding___ + 970 4 CoreFoundation 0x000000010db4cb28 _CF_forwarding_prep_0 + 120 5 BackBoardServices 0x000000010d020b28 -[BKSHIDEventKeyCommandDescriptor isEqual:] + 155 6 CoreFoundation 0x000000010db1630b -[__NSSetM addObject:] + 411 7 CoreFoundation 0x000000010db466a0 -[NSMutableSet unionSet:] + 736 8 BackBoardServices 0x000000010d0223a3 -[BKSHIDEventRouter addHIDEventDescriptors:] + 38 9 backboardd 0x000000010c73a881 backboardd + 186497 10 libdispatch.dylib 0x000000010e862df5 _dispatch_call_block_and_release + 12 11 libdispatch.dylib 0x000000010e87e4a7 _dispatch_client_callout + 8 12 libdispatch.dylib 0x000000010e868184 _dispatch_queue_drain + 1048 13 libdispatch.dylib 0x000000010e867b3c _dispatch_queue_invoke + 595 14 libdispatch.dylib 0x000000010e869454 _dispatch_root_queue_drain + 565 15 libdispatch.dylib 0x000000010e869218 _dispatch_worker_thread3 + 98 16 libsystem_pthread.dylib 0x000000010ebaa4f2 _pthread_wqthread + 1129 17 libsystem_pthread.dylib 0x000000010eba8375 start_wqthread + 13 ) 

EDIT: También quiero enfatizar que esto no es simplemente hacer que la aplicación se bloquee, esto está causando que se reinicie el simulador ENTERO. También puedo activar este reinicio en un dispositivo físico. Si esto fue solo un caso simple de llamar a isEqualToString en un NSNull, ¿no debería SOLO bloquear mi aplicación? ¿No es todo el simulador?

¡Creo que lo descubrí! Estoy bastante seguro de que mi problema es el mismo que el tuyo. Mismo logging de locking y situación.

Traté de aislar el problema, así que copié mi storyboard en un proyecto en blanco y eliminé todas las conexiones e hice todas las classs pnetworkingeterminadas (sin classs personalizadas).

Después de jugar un poco, decidí intentar volver a vincular un controller de vista dividido diferente a las mismas classs maestras y de detalle. ¡Funciona! Entonces comparé todas las configuraciones y, literalmente, nada era diferente. Maldita sea.

¿Ahora que? Abre el código fuente. Haga clic derecho en su storyboard en el panel izquierdo y select "Abrir con editor externo". Esto debería abrir el código fuente del storyboard. Comparé el código fuente de los dos controlleres de vista dividida y encontré una diferencia.

Aquí es donde miré

 <!--Split View Controller--> <scene sceneID="X6N-vM-fHn"> <objects> <splitViewController id="xSd-V6-k6W" customClass="SplitViewController" sceneMemberID="viewController"> <navigationItem key="navigationItem" id="yvV-sB-yKa"/> <keyCommands> <keyCommand/> </keyCommands> <connections> <segue destination="PW6-z0-erU" kind="relationship" relationship="masterViewController" id="MBC-0A-hls"/> <segue destination="xqk-PP-nzR" kind="relationship" relationship="detailViewController" id="sMq-cw-27p"/> </connections> </splitViewController> <placeholder placeholderIdentifier="IBFirstResponder" id="nG8-BB-Qmu" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> <point key="canvasLocation" x="-157" y="-370"/> </scene> 

¿Cual es la diferencia?

 <keyCommands> <keyCommand/> </keyCommands> 

No sé qué es, ni cómo llegó allí, pero cuando quité esas 3 líneas, los choques desaparecieron. Hay una class UIKeyCommand , pero nunca la usé, así que no estoy seguro de si es relevante. ¡Espero que esto ayude!

El logging le dice exactamente qué está mal.

Está intentando llamar a isEqualToString en un object nulo.

Compruebe si este object es el object que espera ANTES de llamar a isEqualToString.

Sin embargo, dado que solía funcionar con versiones anteriores del sistema operativo, solo la comprobación de nulos puede no resolver su problema. Es posible que deba averiguar por qué este elemento ahora es nulo donde no estaba antes.

Como otros han mencionado, se está estrellando en [NSNull isEqualToString:]

Si no está seguro de dónde está su código, puede establecer un punto de interrupción de exception para que sepa exactamente dónde está el crash. Puede hacerlo visitando su Breakpoint Navigator. En la parte inferior izquierda, hay un button + para que usted agregue punto de interrupción de exception:

introduzca la descripción de la imagen aquí

Una vez que haya establecido ese punto de interrupción, ejecute su aplicación nuevamente y debe establecer un punto de interrupción en el lugar donde se produce el locking. ¡Buena suerte!