Pergunta

Eu publiquei um par de perguntas antes, tentando descobrir por que estou recebendo um EXC_BAD_ACCESS, e eu fiz um pouco de depuração

Veja aqui: depuração iPhone app - EXC_BAD_ACCESS

e

Overreleasing aqui?

Então, eu pensar eu descobri o que está acontecendo.

Do meu log, eu estou recebendo este:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000f
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x00003ebc objc_msgSend + 20
1   MyApp                       0x0000378a -[PictureView clearPage] (PictureView.m:79)

No começo eu pensei que o problema foi um ser objeto lançado enviou uma mensagem dentro da função 'clearpage', no entanto, uma vez conversando com um amigo, sou levado a crer que o próprio objeto PictureView já pode ser liberado.

Isto é confirmado pela minha saída de log:

Fri Jan  8 20:28:32 unknown MyApp[2224] <Warning>: Picture View Unloaded
Fri Jan  8 20:28:32 unknown  MyApp[2224] <Warning>: Memory warning from Picture view
Fri Jan  8 20:28:34 unknown  MyApp[2224] <Warning>: Scaling image
Fri Jan  8 20:28:36 unknown  MyApp[2224] <Warning>: Attempting to save image to disk
Fri Jan  8 20:28:37 unknown  MyApp[2224] <Warning>: Saved file to: /var/mobile/Applications/065C0D37-95C1-41D4-98F0-16A3555682CD/Documents/MyImage1.jpg
Fri Jan  8 20:28:37 unknown  MyApp[2224] <Warning>: Clearing page
Fri Jan  8 20:28:40 unknown ReportCrash[2225] <Notice>: Formulating crash report for process  MyApp[2224]
Fri Jan  8 20:28:41 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.yourcompany.MyApp[0xb8e1]) Job appears to have crashed: Bus error

Então, meu palpite é o ponto de vista que eu estou usando está sendo descarregado depois de receber um aviso de memória causada pelo imagepicker ...

E a minha pergunta é, como posso impedir que isso aconteça? Eu, obviamente, precisa chamar o método clearpage do PictureView, mas eu não posso se ele está descarregado.

Foi útil?

Solução

é PictureView retido no seu controlador (estou assumindo que é um subview de vista de seu controlador)? Se não for mantida, então você tem uma referência pendente. Quando o controlador de vista não é mais à frente, e recebe uma mensagem -didReceiveMemoryWarning, por padrão, ele vai lançar seu membro vista. Se você tem ponteiros em subviews de que, e eles não estão retidos, você vai acabar nesta situação.

A primeira coisa a fazer é substituir -didReceiveMemoryWarning e chamando clearpage:

- (void) didReceiveMemoryWarning {
    [myPictureView clearPage];
    myPictureView = nil;
    [super didReceiveMemoryWarning];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top