Pregunta

Estoy usando un UINavigationController y tengo problemas para liberar objetos cuando presiono una nueva vista. Quiero establecer un objeto en el nuevo controlador antes de empujarlo. La forma en que estoy haciendo esto actualmente es:

OpenPageViewController *varOpenPageController = [[OpenPageViewController alloc] initWithNibName:@"OpenPageViewController" bundle:nil];
varOpenPageController.bookObj = bookObj;
[[self navigationController] pushViewController:varOpenPageController animated:YES];
//[varOpenPageController release];

Si elimino el comentario de la última línea, el programa se bloquea cuando navego por el controlador. También tengo otra pregunta sobre cuándo / cómo liberar un objeto. En el bookObj tengo una matriz mutable de objetos de página y quiero cambiar el texto del objeto de página actual. Hago esto por:

Page *pageObj = [[bookObj pagesArray] objectAtIndex:currentPage];
pageObj.page_Text = textView.text;
[[bookObj pagesArray] replaceObjectAtIndex:currentPage withObject:pageObj];
//[pageObj release];

El programa se bloquea si también elimino el comentario de la última línea. Me permitirá navegar hacia adelante, pero cuando navego hacia atrás e intento avanzar de nuevo, se bloquea.

Autoreleasing los objetos traen resultados similares. Por favor aconseja si puedes. Gracias.

EDITAR: Cuando libero el primer ejemplo varOpenPageController y ejecuto el simulador con Fugas, el programa parece funcionar correctamente. Sin embargo, si no ejecuto Fugas, entonces se bloquea. ¿Alguien tiene alguna idea de por qué esto puede suceder? Gracias.

¿Fue útil?

Solución

Puede ser útil leer Documento de gestión de memoria de Apple . El segundo elemento no es necesario que libere pageObj, ya que solo contiene una referencia al elemento real en la matriz bookObj. No es el artículo real si eso tiene sentido. Entonces, lo que estás haciendo en efecto es liberar el elemento real de la matriz, por lo que cuando regresas e intentas acceder a él, no está allí.

La regla general es: solo libera lo que creas.

Otros consejos

Su primer ejemplo de empujar el controlador de vista en el controlador de navegación es correcto con la versión. Si se produce un fallo cuando regresa, es probable que haya un error en el método dealloc de OpenPageViewController, pero algo está mal en alguna parte, ya que el controlador de navegación retiene el controlador de vista y debe asegurarse de liberarlo después de presionar (si tiene) asignó la instancia del controlador de vista como lo hizo en su código).

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