Сбой программы при переключении между вкладками 5 раз - PullRequest
2 голосов
/ 22 августа 2009

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

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");

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

Ответы [ 2 ]

1 голос
/ 22 августа 2009

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

0 голосов
/ 07 октября 2009

(не мог прокомментировать, поэтому мне пришлось использовать щель для ответа)

У меня похожая проблема, также с использованием пользовательских ячеек таблицы. Мои ячейки создаются на основе учебника, найденного здесь (минуты 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 IB выход.

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

EDIT

Наконец-то разобрался!

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

Было бы хорошо, чтобы оно появилось до отката, чтобы не было "flickr" при возврате к основному виду после уведомления памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...