2009-08-21 2 views
2

У меня странная ошибка. Я не уверен, как выследить. Я запускаю приложение в Simmulator 3.0. Он имеет три вкладки на tabBarcontroller, назовем их tab1, tab2 и tab3. Все три вкладки являются подклассом настраиваемой сгруппированной таблицы. Если я буду нажимать между вкладками 1 и 3 на неопределенный срок, нет никаких проблем. Однако, если я нажимаю с tab1 или tab3 на tab2 ровно пять раз, программа вылетает после нажатия на tab1 или tab3. У меня было два разных цепочек вызовов (в основном идентичны), когда я делаю это:Крушение программы при переключении между вкладками 5 раз

backtrace1:

objc[2988]: FREED(id): message release sent to freed object=0xfec100 
Program received signal: “EXC_BAD_INSTRUCTION”. 
(gdb) backtrace 
#0 0x92a2dbfa in _objc_error() 
#1 0x92a2dc30 in __objc_error() 
#2 0x92a2c637 in _freedHandler() 
#3 0x302042e8 in CFRelease() 
#4 0x00370c31 in CALayerUpdateSublayers() 
#5 0x0036f173 in -[CALayer dealloc]() 
#6 0x0036100e in CALayerRelease() 
#7 0x00369dad in CALayerFreeTransaction() 
#8 0x003620b8 in CA::Transaction::commit() 
#9 0x0036a2e0 in CA::Transaction::observer_callback() 
#10 0x30245c32 in __CFRunLoopDoObservers() 
#11 0x3024503f in CFRunLoopRunSpecific() 
#12 0x30244628 in CFRunLoopRunInMode() 
#13 0x32044c31 in GSEventRunModal() 
#14 0x32044cf6 in GSEventRun() 
#15 0x309021ee in UIApplicationMain() 
#16 0x0000208a in main (argc=1, argv=0xbfffefbc) at /Users/johnbulcher/Documents/myApps/AnApp/main.m:14 

backtrace2:

Program received signal: “EXC_BAD_ACCESS”. 
(gdb) backtrace 
#0 0x92a3d688 in objc_msgSend() 
#1 0x302042e8 in CFRelease() 
#2 0x00370c31 in CALayerUpdateSublayers() 
#3 0x0036f173 in -[CALayer dealloc]() 
#4 0x0036100e in CALayerRelease() 
#5 0x00369dad in CALayerFreeTransaction() 
#6 0x003620b8 in CA::Transaction::commit() 
#7 0x0036a2e0 in CA::Transaction::observer_callback() 
#8 0x30245c32 in __CFRunLoopDoObservers() 
#9 0x3024503f in CFRunLoopRunSpecific() 
#10 0x30244628 in CFRunLoopRunInMode() 
#11 0x32044c31 in GSEventRunModal() 
#12 0x32044cf6 in GSEventRun() 
#13 0x309021ee in UIApplicationMain() 
#14 0x0000208a in main (argc=1, argv=0xbfffefbc) at /Users/johnbulcher/Documents/myApps/AnApp/main.m:14 

Я до сих пор, чтобы иметь возможность дублировать backtrace1, хотя backtrace2 такой же последовательный, как и часовой. В этой катастрофе есть две странные вещи:

1) программное переключение между вкладками с использованием «tabBarController.selectedIndex» не приводит к сбою приложения - мне нужно вручную выбрать вкладки, чтобы свернуть приложение. 2) Я не вижу ни одного из моего кода, указанного в обратной линии, кроме основного. Строка коды в основном указан в трассировке является

int retVal = UIApplicationMain(argc, argv, nil, @"AnAppDelegate"); 

Где я должен начать смотреть, чтобы решить эту ошибку?

ответ

1

Основываясь на трассировке стека, похоже, что ОС закончена с переходом от одного вида к другому и пытается очистить что-то, что уже освобождено. Я предполагаю, что есть что-то, что и ваше приложение, и операционная система, но вы освободили свою сторону больше, чем вы ее сохранили, в результате чего последующая версия ОС сбой. Первая обратная трассировка - это двойное освобождение объекта, который уже выпущен; второй пытается отправить сообщение объекту, который больше не существует.

+0

Думаю, я понял, что происходит не так. Я использую пользовательскую ячейку во всех трех вкладках, и я создаю ячейку с -autorelease. Однако в tab2 только что-то вроде: TitledCell * aCell = [[codeToInitCell] autorelease]; cell = aCell ;, тогда как в tab1 и tab3 я устанавливаю ячейку напрямую. Я предполагаю, что aCell был выпущен «в какой-то момент в будущем», но приложение затем попыталось освободить ячейку. Звучит ли это правильно? – JoBu1324

+0

Да, это могло быть преступником. – fbrereto

0

(не могли бы прокомментировать, так что я должен был использовать слот ответа)

я с аналогичной проблемой, а также с помощью пользовательских ячеек таблицы. Мои клетки создаются based on the tutorial found here (протокол 12:02 вперед являются наиболее актуальными):

MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"MyTableCellView" owner:self options:nil]; 
    cell = self.myTableCell; 
} 

У меня есть MyTableCellView.xib, который имеет его владелец указал на TableViewController. Контроллер имеет выходную розетку myTableCell.

У меня нет никаких проблем/утечек. Clang/LLVM не вызывает проблем. Я делаю стресс-тест с «Имитировать предупреждение памяти» в симуляторе. Приложение вылетает каждый раз с ошибкой, аналогичной вашей.

EDIT

Наконец понял это!

Ну, я не знал, что вы должны положить IBOutlet s в didReceiveMemoryWarning (аналогично viewDidUnload).

Было бы хорошо, если бы оно снова появилось перед откидной крышкой, поэтому при возвращении к главному виду после уведомления о памяти нет «flickr».