Подтвердить что ты не робот

UIKit: [UIViewController mutableChildViewControllers] сбой?

Недавно я получил отчет о сбоях от 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.

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

4b9b3361

Ответ 1

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

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

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

Заключительное примечание, не используйте ARC. Что-то, что запрещает вызывать функции суперкласса, обязательно испортится. Если вы понимаете, что мост Core Foundation, возможно, ARC в порядке. Я лично избегаю этого во что бы то ни стало. B/c память случайно обрабатывается Apple под капотом. Я видел, как их материал слишком сильно терпит неудачу.

Ответ 2

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

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) Если вы запустите приложение в отладчике и установите контрольную точку в функции throw throw, приложение остановится при вызове исключения, и этого обычно будет достаточно, чтобы понять это. Перейдите в панель точек останова отладчика, а внизу слева - элемент управления, который при нажатии позволяет установить контрольную точку исключения.