|
Hola, Ando bastante desesperado con un fragmento de código. El caso es que se me produce un error de memoria de esos repentinos que da a veces. Es es por hacer un duble free (como dice el compilador), es decir, que he hecho un release de mas y cuando la aplicación va a hacer el release se encuentra que este ya esta hecho. He visto la linea de código que produce ese error pero no lo comprendo. El fragmento de código es este:
La linea que da error es [button release]. Si comment era linea el error no se produce. El case es que no comprendo pro qué debo quitarla. Cuando hago el addsubview del botón la cuenta de referencias pasa a ser de 1 a 2. Cuando ejecuto el release se queda en 1, porque la tiene el scroll, como debe ser, creo. Al quitar el release la cuenta del botón se queda en 2 con lo que cuando cierre la View ese objeto no se destruiría. Alguien me puede decir por qué tengo que quitar el release??? |
|
Quizá el error esté en la línia 17 donde liberas un string que ya está autoreleased ( Yo creo que no. El método pathForResource de NSBundle es - y no + con lo que, hasta donde creo que se, esos retornos no hacen autorelease. En cualquier caso, si quito ese release, sigo teniendo el problema.
(08 Dic '11, 18:36)
MacMux
El + y el - no tienen absolutamente nada que ver con la gestión de memoria, sólo indican si el método es de clase o de instancia. La forma en que un método nos devuelve un objeto viene indicada por el verbo del propio método: alloc*, *copy*, new*, *create* (en CoreFoundation) devuelven objetos con retainCount == 1. Cualquier otro método, generalmente, debe retornar un objeto autoreleased. Para más información puedes mirar la documentación de Apple al respecto. Volviendo a tu problema, no tengo ninguna duda que en la línea 17 hay un error, lo que no quita que pueda haber más en otras partes del código. Revisa los retain/release y activa los zombies para encontrar el culpable.
(08 Dic '11, 19:48)
Xavier Jurado ♦
MUCHÍSIMAS GRACIAS. Tenias razón. Era eso. He leído de nuevo el tema Memory Management y me estaba confundiendo en unos cuantos sitios del programa. Desgraciadamente luego este falla cuando menos lo esperas y yo, personalmente, me vuelvo loco buscando los errores. Pues eso, muchas gracias Xavier.
(08 Dic '11, 23:27)
MacMux
|
|
En teoría para casos como este la variable button debería ser autorelease pero no sé mucho de los autorelease. Tengo un código similar al tuyo. La línea [button release]; la dejé dentro del for y no dio problema. En mi caso, me llegó a pasar que a la hora de pulsar el botón, la aplicación tronaba con un error EXC_BAD _ACCESS. Lo resolví así:: Creé en el .h un NSMutableArray
Antes de iniciar el for, inicializaba la propiedad
En el ciclo for, y antes de liberar button
Después de salir el ciclo
Si tu programa funciona bien, no me hagas caso. este código (según mi deducción) es porque se perdían las referencias de los botones y a la hora de disparar el evento al pulsar, ya no encontraba al bóton en cuestión. |