Мой главный контроллер приложения вызывает субконтроллер для обработки определенной последовательности экранов. Главный контроллер устанавливает себя как делегат в субконтроллере. Когда субконтроллер делает свое дело, он уведомляет делегата. Время от времени это уведомление завершается с ошибкой EXC_BAD_ACCESS.
0) В зависимости от gdb проблема возникает в objc_msgSend. Оба регистра имеют ненулевое значение.
gdb: 0x3367cc98 <+0016> ldr r5, [r4, #8]
1) Я пытался отследить проблему с помощью NSZombiesEnabled, но потом не смог ее воспроизвести.
2) Я пытался установить точку останова непосредственно перед проблемной командой, но снова не могу воспроизвести проблему.
Понятия не имею, что происходит.
Это объявление свойства делегата (родительский контроллер переживает дочерний элемент):
@property (assign) id<ParentControllerDelegate> delegate
Это проблемный код:
- (void) doStuff {
if(mode == Done) {
NSLog(@"Done. Handling back control");//this is the last log displayed by the console
[self.delegate done: self];
} else {
// some controller code
}
Это код на стороне делегата (делегат был сохранен в App_Delegate, поскольку он является главным контроллером).
- (void) done: (UIViewController *) caller {
NSLog(@"Taken back control");// this never displays
[caller.view removeFromSuperview];
[caller release];
}
Дополнительная информация:
Главный контроллер сохраняет субконтроллер.
Я также изменил dealloc в главном и вспомогательном контроллерах, чтобы он регистрировался при его вызове. Судя по видимым журналам, ни один из них никогда не вызывается в течение приложения. Следовательно, и получатель, и отправитель сообщения являются действительными объектами.
Я действительно в недоумении. Ждем вашей помощи.