Ver sendo liberado quando em uso devido a avisos de memória
-
19-09-2019 - |
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
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.
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];
}