iPhone4 EXC_BAD_ACCESS для UIView после освобождения. Как отлаживать?

#exception #uiview #ios4 #uinavigationcontroller #iphone-4

#исключение #uiview #ios4 #uinavigationcontroller #iphone-4

Вопрос:

Я работаю с примером графика акселерометра Apple: http://developer.apple.com/library/ios/#samplecode/AccelerometerGraph/Introduction/Intro.html

Я помещаю 2 графических представления в навигационный контроллер:

   GraphViewController* graphViewController = [[GraphViewController alloc]initWithNibName:@"GraphViewController" bundle:nil];

    [self.navigationController pushViewController:graphViewController animated:YES];
    [graphViewController release];
  

График обновляется внешним методом:

      [motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) {
...

      if(graphDelegate)
                    {
                        [self performSelectorInBackground:@selector(notifyGraphDelegateWithMotionEvent:) withObject:motion];

                    }

}
  

, который вызывает

  [unfiltered addX:filteredValue y:unfilteredvalue z:10]; 
  

для каждого графика. Частота обновлений составляет 20 раз в секунду

Когда я открываю представление из контроллера навигации, я получаю EXC_BAD_ACCESS после [super dealloc]

 -(void)dealloc
{
    // Since 'text' and 'current' are weak references, we do not release them here.
    // [super dealloc] will take care to release 'text' as a subview, and releasing 'segments' will release 'current'.
    [segments release];
    [super dealloc];
}
  

Это неприятная ошибка, и я действительно не знаю, как устранить что-то подобное. Похоже, что-то о порядке, в котором отменяются представления, поскольку сбой происходит после того, как представление выскакивает. Есть идеи о том, как устранить неполадки в чем-то подобном?

Комментарии:

1. Вы пробовали NSZombieEnabled в YES в своих переменных среды? Если нет, попробуйте сначала.

2. Что сказал Никита. Вероятно, вы чрезмерно освобождаете объект, и NSZombie он предназначен для обнаружения этого.

3. @Alex Stone код, который вы нам показали, выглядит для меня нормально. Исправление EXC_BAD_ACCESS — это весело. Сообщите нам, что произойдет, когда вы включите NSZombieEnabled. Если это не сработает, вы можете либо опубликовать весь свой пример проекта (заархивируйте его и поделитесь ссылкой здесь ), кто-нибудь просмотрит ваш код

Ответ №1:

Установите NSZombieEnabled, MallocStackLogging и защитите malloc в отладчике. Затем, когда ваше приложение выйдет из строя, введите это в консоли gdb:

 (gdb) info malloc-history 0x543216
  

Замените 0x543216 на адрес объекта, который вызвал сбой, и вы получите гораздо более полезную трассировку стека, и это должно помочь вам точно определить точную строку в вашем коде, которая вызывает проблему.

Смотрите Эту статью для получения более подробных инструкций.

Комментарии:

1. Спасибо, я попробую это в следующий раз, когда в мой код вкрадется какая-нибудь сумасшедшая ошибка, подобная этой!