#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. Спасибо, я попробую это в следующий раз, когда в мой код вкрадется какая-нибудь сумасшедшая ошибка, подобная этой!