Когда вы вызываете dismissB, делегат отклоняет view-контроллер.При нормальных обстоятельствах (если вы не сохраняете его в другом месте) это приводит к синхронному освобождению контроллера представления.И после этого вы пытаетесь получить доступ к переменной экземпляра делегата, но для этого в коде необходим разумный (скрытый) собственный указатель, который отменяется.Я не уверен, что NSZombie может помочь в этом случае.Вы можете легко выяснить, является ли это причиной вашего сбоя, вставив [[self retain] autorelease];
перед [delegate dismissB];
.Однако это взлом, а не исправление.У вас проблема с дизайном.
Это не тот способ использования делегатов.B представляет некоторый пользовательский интерфейс и получает некоторое взаимодействие с пользователем.Затем он должен сообщить A, что произошло через сообщение делегата, например, bWasCanceled или bFinished.В вашем случае А обязан делегат решить, что делать дальше.Таким образом, в вашем случае делегат может решить отклонить B и вместо этого представить C. Или в коде:
// Inside A
- (void)controllerB:(UIViewController*)ctl didFinishWithResult:(id)something {
[self dismissModalViewControllerAnimated:NO];
// Instantiate and initialize c
[self presentModalViewController:c animated:NO];
}
// Inside B
[delegate controllerB:self didFinishWithResult:@"OK"];
Если я полностью неверно истолковал ваш код, и все в порядке, у меня есть другое предложение.Я видел странные проблемы при отклонении и представлении модальных контроллеров представления в том же раунде цикла выполнения.Вы можете попробовать [delegate performSelector:@selector(presentC) withObject:nil afterDelay:0.0];
и посмотреть, поможет ли это.