0

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

Смотрите здесь : Help debugging iPhone app - EXC_BAD_ACCESS

и:

Overreleasing here?

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

Из моего журнала, я получаю это:

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 

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

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

ответ

3

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

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

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

К сожалению, clearPage не делать то, что название намекает на. Он просто подготавливает представление для перерисовки, очищая его подзоны. PictureView - это представление, выведенное из rootviewcontroller: PictureView * picView = [[PictureView alloc] initWithNibName: @ "PictureView" bundle: nil]; \t [self.navigationController pushViewController: picView animated: YES]; \t [релиз picView]; Должен ли я выпускать это здесь? –

+0

Итак, PictureView - это ViewController? Похоже, у вас проблема с висячим указателем. Проверьте назначенные розетки (в отличие от сохранения). Кроме того, переопределите didReceiveMemoryWarning и перерыв там; вызовите унаследованное, а затем убедитесь, что все ваши точки доступа являются «нормальными» значениями. –

+0

Я сделал PictureView выход и установил его (неатомный, сохраняющий) в корневом контроллере. К сожалению, этот сбой не происходит каждый раз, поэтому его действительно сложно проверить. Теперь у меня на нервы :( –

Смежные вопросы