Pergunta

Estou usando um UinavigationController e estou tendo problemas para liberar objetos quando pressiono uma nova visualização. Quero definir um objeto no novo controlador antes de empurrá -lo. A maneira como estou fazendo isso atualmente é:

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

Se eu descomentar essa última linha, o programa trava quando eu navego de volta pelo meu controlador. Eu também tenho outra pergunta sobre quando/como liberar um objeto. No bookobj, tenho uma matriz mutável de objetos de página e quero alterar o texto do objeto atual da página. Eu faço isso por:

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

O programa trava se eu também descompor essa última linha. Isso me permitirá navegar para a frente, mas quando eu navegar e tentar seguir em frente, ele trava.

Aleporar os objetos trazem resultados semelhantes. Por favor, informe se puder. Obrigado.

EDIT: Quando libero o primeiro exemplo VaropenPageController e execute o simulador com vazamentos, o programa parece funcionar corretamente. No entanto, se eu não executar vazamentos, ele trava. Alguém tem alguma idéia por que isso pode acontecer? Obrigado.

Foi útil?

Solução

Pode pagar para ler o Documento de gerenciamento de memória da Apple. O segundo item que você não precisa liberar o PageOBJ, pois ele contém apenas uma referência ao item real na matriz bookobj. Não é o item real se isso faz sentido. Então, o que você está fazendo é lançar o item real da matriz; portanto, quando você volta e tenta acessá -lo, ele não está lá.

A regra geral é: libere apenas o que você cria.

Outras dicas

Seu primeiro exemplo de empurrar o controlador de exibição para o controlador de navegação está correto com a liberação. Se isso estiver travando quando você voltar, provavelmente significa que você tem algo errado no método OpenPageViewController Dealloc, mas algo está errado em algum lugar, pois o controlador de navegação mantém seu controlador de exibição e você deve liberá -lo depois de pressionar (se você tiver alocar a instância do controlador de exibição como você fez em seu código).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top