UIKit: сбой [UIViewController mutableChildViewControllers]? - PullRequest
21 голосов
/ 18 марта 2012

Я недавно получил отчет о сбое от itunes connect. На самом деле это единственный отчет о сбоях, который я получил от тысяч пользователей. Это устройство iPod4,1. Интересные части:

Date/Time:       2012-02-27 22:53:27.596 +0800
OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x338958bf __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x303891e5 objc_exception_throw + 33
2   UIKit                           0x31259749 -[UIViewController mutableChildViewControllers] + 1
3   UIKit                           0x31259349 -[UINavigationController pushViewController:animated:] + 37
4   MyApp                           0x000081e5 -[MyListController tableView:didSelectRowAtIndexPath:] (MyListController.m:207)
5   UIKit                           0x312d3565 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 945
6   UIKit                           0x3134bce7 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 159

Кажется, что сбой происходит, когда выбирается строка из табличного представления, и новый контроллер представления вставляется в навигацию. Согласно моему коду, новый контроллер представления уже создан, поэтому сбой произошел в UINavigationController.

Это не похоже на ошибку кода, который я написал. И мне интересно, прав ли я в этом? Как мне отладить эту проблему?

Ответы [ 2 ]

1 голос
/ 28 ноября 2012

Похоже, пользователь получил предупреждение о нехватке памяти. UINavigationControllers сохранят свои представления, а вкладки будут отображаться невидимыми. Однако код низкой памяти все еще вызывается. Проверьте ваши обработчики предупреждений до достижения этого места. Кроме того, проверьте, нажав «Предупреждение о симуляции памяти» в меню оборудования во всех точках входа и выхода. http://forums.macrumors.com/showthread.php?t=876419 показывает беспорядок того, что происходит, когда вы этого не делаете. В iphonedevsdk.com/forum/iphone-sdk-development/14225-uinavigationcontrollers-and-didreceivememorywarning.html есть хороший комментарий о том, как с этим справиться.

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

Вышесказанное может быть не на отметке, но должно быть связано.

Последнее замечание, не используйте ARC. То, что запрещает вызывать функции суперкласса, обязательно облажается. Если вы понимаете мостовое ядро, тогда, возможно, с ARC все в порядке. Я лично избегаю этого любой ценой, так как память Apple случайно обрабатывает память. Я видел, как их вещи терпят неудачу слишком сильно

0 голосов
/ 03 октября 2012

Я понял!У меня тоже была такая же проблема, и в вашем коде похоже, что нажата кнопка, которая вызывает сбой!

Last Exception Backtrace:
0   CoreFoundation                  0x338958bf __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x303891e5 objc_exception_throw + 33
2   UIKit                           0x31259749 -[UIViewController mutableChildViewControllers] + 1
3   UIKit                           0x31259349 -[UINavigationController pushViewController:animated:] + 37
4   MyApp                           0x000081e5 -[MyListController tableView:didSelectRowAtIndexPath:] (MyListController.m:207)
5   UIKit                           0x312d3565 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 945
6   UIKit                           0x3134bce7 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 159

Вот мое предложение:

Две вещи, которые нужно решить SIGABRT:

1) SIGABRT происходит из-за исключительной ситуации во время выполнения.Когда это происходит, в консоль отладчика или консоль устройства записывается некоторая информация, объясняющая точную причину исключения.Вы не показали нам этот текст.Он запускает «Завершение приложения из-за ...»

Покажите нам этот текст.

2) Если вы запустите свое приложение в отладчике и установите точку останова для функции выброса исключения, приложение будетостановитесь, когда выдается исключение, и этого обычно будет достаточно, чтобы понять это.Перейдите на панель точек останова отладчика и в левом нижнем углу находится элемент управления, который при нажатии позволяет установить точку останова исключения.

...