У меня такая же проблема довольно последовательно. Кажется, это связано с тем, что я представляю контроллер модального представления от popover, который не очень хорошо протестирован и вызывает ошибку в коде Apple. Ошибка заключается в том, что UIKit хранит неиспользуемую ссылку на мой контроллер просмотра, который уже уволен и освобожден, поэтому позже ссылка будет удалена. Мое обходное решение заключается в том, чтобы избежать представления модальных VC из popover или сохранить все такие VC самостоятельно на неопределенный срок (в переменной-члене или в некоторых таких).
Ниже перечислены детали gory.
Вот код, который я использовал, чтобы вызвать проблему.
-(void) handlePinchFromCell:(AMPSupportingPhotoCell*) cell
{
UIViewController * vc = [[UIViewController alloc] init]; // UIViewController #0
[self presentViewController:vc animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:vc afterDelay:2];
}
-(void) dismiss:(UIViewController*)vc
{
[self dismissViewControllerAnimated:YES completion:^(){NSLog(@"-------");}];
}
Этот код является частью UIViewController # 1, то есть внутри UIPopoverController, что извлекается из другого над UIViewController # 2, который сам по себе является представлена от еще одного вида UIViewController 3 #. Сбой происходит после закрытия popover, диспетчер № 2 отклоняется.
Если включить зомби, я получаю один и тот же трассировку стека, но с сообщением:
2013-03-13 20:04:24.681 Mercury[16698:19d03] handlePinchFromCell: a225710
2013-03-13 20:04:27.083 Mercury[16698:19d03] -------
2013-03-13 20:04:31.606 Mercury[16698:19d03] *** -[UIViewController retain]: message sent to deallocated instance 0xa225710
Итак, обратите внимание, что VC# 0 был выделены, представлены, уволенный спустя 2 секунды, высвобождены, и все же есть все еще болтается ссылкой на него где-то в коде Apple. Когда popover закрыт и VC# 2 уволен, все дело рушится, пытаясь получить доступ к освобожденному VC. Я вполне уверен, что это ошибка Apple. Я также предполагаю, что это связано с представлением VC из popover, поэтому, если вы держитесь подальше от этого или сами сохраните VC, вы должны быть в порядке.
Другая трассировка стека для той же проблемы - это. Это происходит, если вышеуказанный код запускается дважды:
2013-03-13 20:12:53.883 Mercury[16735:19d03] handlePinchFromCell: 16d54da0
2013-03-13 20:12:56.285 Mercury[16735:19d03] -------
2013-03-13 20:13:03.481 Mercury[16735:19d03] handlePinchFromCell: a2565f0
2013-03-13 20:13:03.481 Mercury[16735:19d03] *** -[UIViewController isKindOfClass:]: message sent to deallocated instance 0x16d54da0
(lldb) bt
* thread #1: tid = 0x1f03, 0x017f8a97 CoreFoundation`___forwarding___ + 295, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
frame #0: 0x017f8a97 CoreFoundation`___forwarding___ + 295
frame #1: 0x017f894e CoreFoundation`_CF_forwarding_prep_0 + 14
frame #2: 0x00c42f90 UIKit`-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 907
frame #3: 0x00a40ee3 UIKit`-[UIViewController presentViewController:withTransition:completion:] + 4521
frame #4: 0x00a41167 UIKit`-[UIViewController presentViewController:animated:completion:] + 112
frame #5: 0x0006c32d Mercury`-[AMPSupportingPhotosViewController handlePinchFromCell:](self=0x16d55360, _cmd=0x0007a64a, cell=0x0a22a2a0) + 205 at AMPSupportingPhotosViewController.m:184
frame #6: 0x015336b0 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #7: 0x0006f317 Mercury`-[AMPSupportingPhotoCell handlePinch:](self=0x0a22a2a0, _cmd=0x00efb0db, sender=0x0a2504a0) + 215 at AMPSupportingPhotoCell.m:53
frame #8: 0x00c2185a UIKit`_UIGestureRecognizerSendActions + 139
интересно действительно. В моем случае я представляю контроллер модального представления с другого модального контроллера. Ты тоже думаешь? Они всегда освобождаются в правильном порядке, но на основании того, что вы говорите, кажется, что если кто-то скажет, что ударить отмену на первом модальном контроллере, а затем быстро нажать отменить на исходном модульном контроллере, который может вызвать сбой? –
Я думаю, что это то же самое - VC застрял где-то в системе Apple. – DenNukem