ios - reconoce - itunes esta esperando a que windows update instale el controlador para este iphone
Ver el controlador que se envĂa un mensaje a pesar de que ha sido desasignado (9)
Esta es una buena razón para configurar ToolbarController = nil
después de liberarlo. Es seguro enviar mensajes a cero, pero no a direcciones de objetos desasignados. En este caso, envía un mensaje a una dirección de un objeto que no sale, lo que está provocando un bloqueo.
¡Es una pérdida de tiempo comprobar el ToolbarController != nil
antes de enviar el mensaje, porque si es nulo, entonces puede enviar el mensaje de forma segura. si no es nulo y válido, devolverá SÍ o NO. Pero si se trata de un puntero a la memoria desasignada (como parece que tiene aquí) va a colapsar de todos modos.
No estoy seguro de si algo ha cambiado en el iPhone SDK 3.0, pero estoy recibiendo el error más extraño. Tengo una jerarquía de controlador de vista donde cambio entre los controladores de vista dependiendo de la orientación de la interfaz. Por lo que puedo decir, el error se produce cada vez que giro la interfaz a un controlador de vista que ha sido desasignado y se le está enviando un mensaje de shouldAutorotateToInterfaceOrientation. Esta es la traza inversa del error:
#0 0x01dc43a7 in ___forwarding___
#1 0x01da06c2 in __forwarding_prep_0___
#2 0x002e6733 in -[UIWindow _shouldAutorotateToInterfaceOrientation:]
#3 0x002e6562 in -[UIWindow _updateToInterfaceOrientation:duration:force:]
#4 0x002e6515 in -[UIWindow _updateInterfaceOrientationFromDeviceOrientation]
#5 0x0004d63a in _nsnote_callback
#6 0x01d8f005 in _CFXNotificationPostNotification
#7 0x0004aef0 in -[NSNotificationCenter postNotificationName:object:userInfo:]
#8 0x0045b454 in -[UIDevice setOrientation:]
#9 0x002d6890 in -[UIApplication handleEvent:withNewEvent:]
#10 0x002d16d3 in -[UIApplication sendEvent:]
#11 0x002d80b5 in _UIApplicationHandleEvent
#12 0x024c2ef1 in PurpleEventCallback
#13 0x01d9bb80 in CFRunLoopRunSpecific
#14 0x01d9ac48 in CFRunLoopRunInMode
#15 0x024c17ad in GSEventRunModal
#16 0x024c1872 in GSEventRun
#17 0x002d9003 in UIApplicationMain
#18 0x00002d50 in main at main.m:14
El error que se imprime en la consola de depuración con NSZombieEnabled es:
2009-10-18 20:28:34.404 Restaurants[12428:207] *** -[ToolbarController respondsToSelector:]: message sent to deallocated instance 0x3b2b2a0
(gdb) continue
Current language: auto; currently objective-c
2009-10-18 20:31:43.496 Restaurants[12428:207] *** NSInvocation: warning: object 0x3b2b2a0 of class ''_NSZombie_BeltToolbarController'' does not implement methodSignatureForSelector: -- trouble ahead
2009-10-18 20:31:43.496 Restaurants[12428:207] *** NSInvocation: warning: object 0x3b2b2a0 of class ''_NSZombie_BeltToolbarController'' does not implement doesNotRecognizeSelector: -- abort
Lo que no puedo entender es por qué el sistema está tratando de enviar mensajes a este controlador a pesar de que ha sido desasignado y hay una manera de decirle al sistema que el controlador ya no existe.
[ACTUALIZACIÓN]: He creado un proyecto de muestra que replica el error: descargar
Cargue la aplicación y luego cambie la orientación del Simulador algunas veces de Horizontal a Vertical y debería ocurrir. He probado el mismo código en un teléfono físico y se comporta exactamente de la misma manera, por lo que este no es un problema relacionado con el simulador.
[ACTUALIZACIÓN]: He utilizado una de mis solicitudes de soporte técnico con el equipo técnico de Apple para ver si pueden ayudarme a llegar al fondo de esto. Publicaremos la solución, si es que tienen una, aquí. Gracias por la ayuda hasta ahora.
Evidentemente, el controlador todavía está registrado para la notificación en cuestión. envíe -removeObserver: uno mismo al centro de notificaciones en su método -dealloc.
Me he encontrado con este problema también. El orden de los eventos es:
(1) crea el objeto UIWindow único de la aplicación
(2) agregue una subvista que administra un controlador de vista a la ventana
(3) elimine la primera vista y agregue una nueva
Si giro el dispositivo posteriormente, la aplicación falla debido a un mensaje enviado al controlador de vista desasignado. (Bueno, en realidad lo está enviando a un subcontrolador del primer controlador de vista.) Está intentando enviar - [respondsToSelector: @selector (shouldAutorotateToInterfaceOrientation :)].
Si su aplicación solo se ejecuta en modo retrato, puede hacer que el problema desaparezca agregando una categoría a UIWindow que anula _shouldAutorotateToInterfaceOrientation: para devolver NO para todo lo que no sea el modo vertical.
Obviamente, esta no es una solución real. He comprobado doblemente mi código y no puedo encontrar ninguna razón por la cual la ventana debería estar enviando este mensaje al controlador para una vista que se ha eliminado de la pantalla y desasignado. Este problema también parece haber aparecido en 3.0 y no antes. Tal vez estoy haciendo algo estúpido, pero realmente parece haber algo extraño en el trabajo aquí.
Mucha confusión aquí ... veamos si esto ayuda:
Lo que no puedo entender es por qué el sistema está tratando de enviar mensajes a este controlador a pesar de que ha sido desasignado y hay una manera de decirle al sistema que el controlador ya no existe.
Si bien la desasignación destruye la instancia de un objeto, no destruye las referencias a las instancias. Con la detección Zombie habilitada, la desasignación hace que el tiempo de ejecución sustituya a un zombie por la instancia. El zombie luego detecta y registra cuando se envía un mensaje.
La razón por la que esto sucede es porque el objeto ha sido desasignado sin eliminar también todas las referencias al objeto del gráfico de objetos de la aplicación. En este caso, parece que el controlador desasignado nunca se desconectó como el controlador de la instancia de UIWindow.
Es decir, el procesamiento de la notificación es una pista falsa . En esa traza inversa, la notificación ya se entregó y UIWindow está en proceso de procesarla. Por lo tanto, el problema está en algún lugar entre la ventana de UI y su aplicación. Lo más probable es que su objeto haya sido desasignado antes de ser eliminado de la ventana como su controlador o delegado.
Antes de que su programa esté realmente hecho con un objeto, antes de enviar la última llamada de -release
que equilibra la última existente, -retain
su aplicación causada o -retain
, debe asegurarse de que se destruyan todas las referencias débiles del objeto. Por ejemplo, si su objeto es el delegado de una ventana UI, asegúrese de establecer el delegado de la ventana en nil
(u otro objeto) antes de enviar esa última -release
.
Ahora, en este caso, también puede ser simplemente que hayas liberado demasiado el objeto. Es posible que aún necesites el objeto, pero un -autorelease
adicional o un -autorelease
algún lado está causando que se destruya antes de que hayas terminado con él.
He estado experimentando el mismo problema hasta que eliminé algunas líneas de código ''chocantes'' que utilicé para impulsar una animación como esas:
UIView* superv = navigationController.view.superview;
[navigationController.view removeFromSuperview];
[superv addSubview:navigationController.view];
Definitivamente, lo anterior está "rompiéndose" camino a seguir ya que 3.0 SDK había sido emitido por Apple. Me he visto obligado a utilizar el enfoque push / pop en su lugar. No tuve el problema con 2.x también. Asegúrate de no tener algo similar en tu código.
Espero eso ayude.
Entonces, después de una semana de espera, el Soporte técnico para desarrolladores de Apple me ayudó a resolver mi problema. Aquí está su respuesta:
"Revisé su código y encontré algunas cosas que deben preocuparle, algunas de las cuales pueden contribuir a su problema. En su fuente
ControllerSwitchAppDelegate.m
, está implementando el método"didRotate
". Puede valer la pena verificarlo. las notificaciones de orientación de dispositivo en el nivel de controlador de vista en lugar de en el nivel de aplicación UIA. Esto hará que su código sea mucho más simple y encapsulado permitiendo que cada controlador de vista que se muestra maneje su propia lógica de rotación. También está usando múltiples controladores de vista al mismo tiempo , es decir, ambas propiedades de "vista" se agregan y eliminan cuando se gira el dispositivo. Este no es exactamente el enfoque común para usar el UIKit. La idea es presentar un controlador de vista (o su propiedad de vista) en un tiempo y no tener un cambio de controlador de vista padre en diferentes controladores de subvista. Concedido en la superficie, su enfoque parece factible, pero a la larga, recomiendo un enfoque diferente.Tenemos una muestra llamada "AlternateViews", que se puede encontrar en - http://developer.apple.com/iphone/library/samplecode/AlternateViews/index.html
En esta muestra, prácticamente hace lo que necesita. Proporciona un controlador de vista "alternativo" para una orientación de dispositivo determinada. Simplemente presenta un controlador de vista sobre otro usando "presentModalViewController" con una propiedad de transición llamada "modalTransitionStyle" que le dará un efecto de fundido cruzado ".
Lo que terminé haciendo fue usar un controlador de súper vista que presentaba y descartaba los controladores de vista. En lugar de intercambiar controladores de vista y eliminar vistas secundarias usando AppDelegate.
Si a alguien le sigue importando, una solución simple es crear un controlador de vista raíz + vista que nunca cambie.
Dado SomeViewController + SomeView A, y SomeViewController + SomeView B, si agrega la vista A a la ventana como subvista, luego agrega la vista B como subvista y elimina la vista A, la aplicación se bloqueará al rotar.
Para evitar el bloqueo, cree un UIViewController + UIView X genérico y agregue la vista X a la ventana como una subvista. Agregue y elimine las vistas A y B a / desde la vista X, no directamente a la ventana. La aplicación ya no se bloqueará.
Tenga en cuenta que no es suficiente simplemente agregar una vista a la ventana; debe agregar una vista que tenga un controlador de vista.
También tuve el mismo problema pero no pude dejar un controlador dando vueltas como la sugerencia de Mark Smith. Quitar el controlador de vista con liberación automática en lugar de liberar o una propiedad retenida parecía ser el truco.
Parece que el UIWindow / framework padre necesita que el controlador de vista permanezca un poco más tiempo para permitirle eliminar el enlace de delegado.
He publicado una respuesta aquí:
https://.com/a/19237139/539149
Tenía un lugar que decía:
[viewController release];
viewController = NULL;
Lo que provocó que la versión se llamara dos veces (por lo que la memoria se liberó inmediatamente) pero el zombie no se reveló hasta que un objeto propiedad de iOS intentó hacer referencia al objeto más adelante en el hilo principal.