Просмотр освобождается при использовании из-за предупреждений памяти - PullRequest
0 голосов
/ 09 января 2010

Я уже писал пару вопросов, пытаясь понять, почему я получаю EXC_BAD_ACCESS, и я немного отладил

Смотрите здесь: Помощь в отладке приложения для iPhone - EXC_BAD_ACCESS

и

Переиздание здесь?

Итак, я думаю Я обнаружил, что происходит.

Из моего журнала я получаю следующее:

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)

Сначала я подумал, что проблема заключается в том, что освобожденный объект посылает сообщение в функции 'clearPage', однако после разговора с другом меня убеждают, что сам объект PictureView уже может быть освобожден.

Это подтверждается моими выводами:

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

Итак, я предполагаю, что используемый мной вид выгружается после получения предупреждения о памяти, вызванного средством выбора изображений ...

И мой вопрос: как я могу предотвратить это? Мне, очевидно, нужно вызвать метод clearPage PictureView, но я не могу, если он выгружен.

1 Ответ

3 голосов
/ 09 января 2010

PictureView сохраняется в вашем контроллере (я предполагаю, что это подпредставление представления вашего контроллера)? Если это не сохранено, то у вас есть свисающая ссылка. Когда ваш контроллер представления не является передним и получает сообщение -didReceiveMemoryWarning, по умолчанию он освобождает своего члена представления. Если у вас есть указатели на подвиды этого, и они не сохранены, вы окажетесь в этой ситуации.

Первое, что нужно попробовать, это переопределить -didReceiveMemoryWarning и вызвать clearPage:

- (void) didReceiveMemoryWarning {
    [myPictureView clearPage];
    myPictureView = nil;
    [super didReceiveMemoryWarning];
}
...