tableviewcontroller с дочерним элементом detailViewController аварийно завершает работу с загадочным EXC_BAD_ACCESS - PullRequest
1 голос
/ 30 июня 2011

У меня есть родительский контроллер табличного представления со свойством контроллера подробного представления только для чтения, который лениво создает контроллер подробного представления. Если я нахожусь на iphone / ipod, я настраиваю и выдвигаю контроллер подробного представления, когда элемент в таблице выбран. Когда подробный вид виден, и я дважды щелкаю обратно в навигационном контроллере, детальный контроллер затем выталкивается из родительского контроллера, и вызывается родительский dealloc. Когда родительский колокольчик достигает линии, где я вызываю [detailViewController release], я получаю аварийное завершение с EXC_BAD_ACCESS от контроллера навигации. Это заставляет меня думать, что моя проблема с управлением памятью detailViewController, но отладка с NSZombies не показывает проблем. (Комментирование строки [detailViewController release] устраняет сбои, но тогда у меня никогда не было выпусков, чтобы уравновесить alloc - памяти утечек detailViewController) Есть идеи, почему я получаю этот сбой?

EDIT: Вот трассировка стека для аварии:

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x01046a63 in objc_msgSend ()
#1  0x0a9d72a0 in ?? ()
#2  0x0000cb4c in -[MyTableViewController dealloc] (self=0xa956840, _cmd=0x127a9d6) at /Users/nick/Documents/MyApp/Classes/MyTableViewController.m:290
#3  0x00390f1d in -[UINavigationController setDisappearingViewController:] ()
#4  0x0038e4f6 in -[UINavigationController _clearLastOperation] ()
#5  0x0038ee3f in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] ()
#6  0x0051be23 in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] ()
#7  0x0051cfd2 in -[UINavigationTransitionView _cleanupTransition] ()
#8  0x00308665 in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] ()
#9  0x003084f7 in -[UIViewAnimationState animationDidStop:finished:] ()
#10 0x0200c6cb in run_animation_callbacks ()
#11 0x0200c589 in CA::timer_callback ()
#12 0x01225fe3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#13 0x01227594 in __CFRunLoopDoTimer ()
#14 0x01183cc9 in __CFRunLoopRun ()
#15 0x01183240 in CFRunLoopRunSpecific ()
#16 0x01183161 in CFRunLoopRunInMode ()
#17 0x01a5a268 in GSEventRunModal ()
#18 0x01a5a32d in GSEventRun ()
#19 0x002e642e in UIApplicationMain ()
#20 0x00001b28 in main (argc=1, argv=0xbffff070) at /Users/nick/Documents/MyApp/main.m:14

EDIT2: Метод dealloc, где происходит сбой:

- (void)dealloc
{
    [context release]; // a managed object context -- when table entries are selected, they get cached in core data
    [tableDataArray release];
    [detailViewController release]; // <-- line 290, this is where it crashes
    [super dealloc];
}

Ответы [ 4 ]

1 голос
/ 01 июля 2011

Вы либо:

A) Забыл сохранить объект, хранящийся в вашем detailViewController ivar

или

B) Выпущенный объект хранится на вашем detailViewController иваре слишком много раз

Таким образом, когда вы пытаетесь освободить detailViewController в вашем методе -dealloc, он уже освобожден и указывает на недопустимую память. Вы должны проверить места, где вы устанавливаете значение detailViewController в этом классе для одной из этих ситуаций. Если вы его не видите, добавьте код, в котором вы управляете этим иваром, к своему вопросу, чтобы мы могли его изучить.

0 голосов
/ 01 июля 2011

Попробуйте сохранить detailViewController после того, как вы присвоите ему значение. Если это работает, это где-то переиздание.

0 голосов
/ 01 июля 2011

Ну, в конце концов я понял ошибку. Когда я сказал в своем первоначальном посте, что я настраиваю и выдвинул контроллер подробного представления, у меня возникла ошибка управления памятью (избыточная версия) в одном из свойств, которые я установил на контроллере подробного представления при настройке детальный вид контроллера. Ошибка обнаружилась в некотором роде косвенным образом, но я поймал ее, когда попытался воссоздать ошибку в другом, новом, более простом VC.

Спасибо тем, кто предложил помощь.

0 голосов
/ 30 июня 2011

Звучит очень похоже на сбой EXC_BAD_ACCESS, который я получил недавно.

Если я правильно помню, Xcode сообщил о сбое в этой строке:

int retVal = UIApplicationMain(argc, argv, nil, nil);

, и я думаю, NSZombie сообщил, чтоCALayer получил сообщение.

Я предполагаю, что ваша ситуация может быть похожей.Можете ли вы подтвердить это?

В любом случае, я работал над приложением для проверки концепции, поэтому мы просто позволили ему утечь и никогда не исправляли его.Я знаю, что это не решит вашу проблему, но может дать вам и другим ответчикам больше информации.Я сам не возражал бы исправить эту утечку, поэтому я надеюсь, что эта информация поможет решить ее.

...