|
Hola estoy haciendo una aplicación para iOS que utiliza la geolocalización en distintas vistas, para poder acceder a los datos en el AppDelegate inicializo el CLlocationManager y el asigno el Delegate como self. De esta forma accedo en las distintas vistas de la aplicación por medio de:
En una vista necesito que actualice información a partir de los cambios de la brújula, para hacer esto agrego el protocolo al controlador de la vista:
Y en la implementación VistaBrujulaViewController para poder poder recibir los datos le asigno el delegado que anteriormente era el AppDelegate:
De esta forma puedo utilizar el método siguiente sin problemas:
El problema ocurre al salir de la vista y volver a la anterior que la aplicación colapsa sin mostrar ningun error por consola, unicamente EXC_BAD _ ACCESS. Antes de salir y volver a la vista anterior hago la siguiente asignación:
Creo que aqui esta el error, pero no se me ocurre otra forma para que vuelva a ser el Delegado. Muchas Gracias y espero que alguien pueda ayudarme. |
Este mensaje quiere decir que alguien (tú o algún framework/librería del iOS) ha intentado enviar un mensaje (en concreto, Si no encuentras esa llamada en tu código, asegúrate de que el cambio de delegado se produce realmente. ¿Donde ejecutas El cambio de delegado lo estaba ejecutando en viewDidUnload, lo he cambiado y lo he puesto en el dealloc y ya no falla al salir. Pero me falla al siguiente paso. La ventana anterior es un tableView y todo se accede a trabes de la barra de navegación. Si al salir de VistaViewViewController por medio del NavView y vuelvo al TableViewController he intento voler a acceder a VistaBrujulaViewController me salta lo siguiente -[CLLocationManager setDelegate:]: message sent to deallocated instance 0x5157430
(30 Nov '10, 19:39)
Menthor
Si embargo, si al salir al TableViewController vuelo a salir a una vista anterior y a partir de esta realizo el camino para entrar a VistaBrujulaViewController no falla. Pero de todas maneras muchísimas gracias, por gastar tu tiempo resolviendo este problema.
(30 Nov '10, 19:39)
Menthor
Probablemente estés haciendo un release del CLLocationManager en algún sitio donde no deberías (algún view controller?). De todas formas, mejor que crees una nueva pregunta si no consigues solucionar el problema!
(30 Nov '10, 19:56)
Xavier Jurado ♦
|
|
Técnicamente no es incorrecto o ineficiente utilizar varios CLLocationManager a través de la aplicación, Apple se encarga que todas las instancias se coordinen y utilicen los mismos datos, en vez de estar pidiendo información a los sensores cada una por separado (es mucho más obvio en el caso del acelorómetro, en el que pides un sharedAccelorometer). De cualquier forma, si quieres utilizar un único CLLocationManager en la aplicación, lo mejor sería que implementases el protocolo UINavigationControllerDelegate en tu AppDelegate, y que se encargase de ceder o quitar el puesto de delegado a la vista que entra/sale del UINavigationViewController. Esta solución deja claro que el AppDelegate es el que posee el CLLocationManager y que es la única que puede modificar el delegado (Ley de Demeter). Otra forma sería jugar con viewWillAppear y viewWillDisappear del UIViewController, almacenando el delegado anterior en el primero, y volviendolo a restaurar en el segundo. El problema es que los delegados no deberían ser retenidos ni liberados, por lo tendrías el peligro de que el viewWillDisappear el delegado anterior haya sido destruido, cosa que no debería pasar en el caso del AppDelegate, pero podría pasar en el caso de que otra vista fuera el delegado y que el OS hubiese decidido liberar memoria eliminándola. Ok, muchas gracias, probaré de distintas formas a ver cual se comporta mejor.
(01 Dic '10, 00:03)
Menthor
|
|
Si, como dices, modificas el delegado antes de liberar tu Para saber exactamente qué objeto ya liberado está provocando un
Dejando de banda el problema concreto de tu post, ¿hay alguna razón por la cual Voy a probar lo de los "zombies" ahora. Lo del CLLocationManager, actualmente creando un CLLlocationManager en VistaBrújulaViewController me funciona correctamente. Pero el CLLlocationManager del AppDelegate sigue corriendo de fondo, he intentado hacer esto para no tener dos CLLlocationManager corriendo a la vez, ya que creo que no seria apropiado, pero no estoy seguro, quizas instanciarlo en distintas clases y tener un delegado en cada una de ellas sea de lo más normal. ¿Que opinais?
(30 Nov '10, 18:34)
Menthor
Al activar NSZombi el EXC_BAD_ACESS se combierte en esto: -[VistaBrujulaViewController respondsToSelector:]: message sent to deallocated instance 0x51d8a40 Estoy googleando a ver si encuentro a que se debe, pero no he encontrado nada de momento. Muchas gracias por el "tip" de los "Zombies" creo que me sera muy útil de aqui en adelante, aunque no encuentre el motivo de este fallo.
(30 Nov '10, 18:59)
Menthor
Puesto que el GPS y el compás son sistemas independientes (se activan por separado), no veo a priori ningún problema en tener dos instancias diferentes de CLLocationManager que los controlen.
(30 Nov '10, 18:59)
Xavier Jurado ♦
|
