Pregunta

El problema: Tengo un UINavigationController como como subvista de UIWindow, una clase RootViewController y una clase MyViewController personalizado. Los siguientes pasos obtener una EXC_BAD_ACCESS, 100% reproducible:.

[myNaviationController pushViewController:myViewController_1stInstance animated:YES];
[myNaviationController pushViewController:myViewController_2ndInstance animated:YES];

Hit la tapBarItem atrás izquierda dos veces (POP dos de los casos myViewController) para mostrar la RootViewController.

Después de un día doloroso medio de prueba y error, finalmente averiguar la respuesta, pero también plantean una pregunta.

La solución: I declaró muchos objetos en el archivo .m como una forma perezosa de la declaración de variables privadas para evitar llenar el archivo .h. Por ejemplo,

#impoart "MyViewController.h"
NSMutableString*variable1;

@implement ...

-(id)init
{
   ...
   varialbe1=[[NSMutableString alloc] init];
   ...
}

-(void)dealloc
{
   [variable1 release];
}

Por algunas razones, el sistema operativo iPhone puede perder la pista de estas variables de asignación de memoria "privada perezoso" cuando se descarga la opinión de myViewController_1stInstance (pero aún en las pilas del mando de navegación) después de cargar la vista de myViewController_2ndInstance. La primera vez que toque la parte posterior es tapBarItem bien ya myViewController_2ndInstance'view se sigue cargando. Pero el segundo golpe en la parte posterior tapBarItem me dio el infierno porque trató de dealloc la primera instancia. Se llama [liberación variable] resultó en EXC_BAD_ACCESS porque señaló al azar (puntero suelto).

Para solucionar este problema es simple, variable1 declarar como @private en el archivo .h.

Aquí está mi pregunta: He estado usando las variables "perezosas" privados desde hace bastante tiempo sin ningún problema hasta que están involucrados en UINavigationController. Es esto un error en el iPhone OS? O hay un error fundamental en mi parte acerca de Objective C?

¿Fue útil?

Solución

Podría estar relacionado con ambas instancias de su controlador de vista utilizando la misma variable asignado estáticamente.

En otras palabras, tanto myViewController_1stInstance y myViewController_2ndInstance están utilizando el mismo lugar variable1 en la memoria y sobrescribir el uno al otro.

Las variables declaradas dentro de las llaves después de su definición @interface tener una ubicación de memoria asignada por el tiempo de ejecución para cada instancia de la clase (cada vez que llame [<ClassName> alloc]. Las variables declaradas en el ámbito global (es decir, fuera de cualquier función o declaraciones de clase) son sólo eso: global que significa que la variable sólo puede tener un valor por correr copia de su solicitud

..

Existen variables sin verdaderamente privadas en Objective-C, pero puede ocultarlos de otras instancias en tiempo de compilación como se describe aquí .

Otros consejos

Un poco de una reacción tardía, pero he visto este problema antes. No empuje dos viewControllers animada al mismo tiempo. Empuje el primero sin animación y empujar el segundo con la animación. UINavigationController no puede manejar dos animaciones al mismo tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top