libc ++ abi.dylib: завершается с необработанным исключением типа NSException (lldb)

186

Я программирую приложение на swift, и когда я запускаю тестовое приложение на симуляторе iPhone, все работает, но затем я пытаюсь провести пальцем вправо, что является жестом, который я добавил для перехода на следующую страницу (View Controller Two) он падает и показывает этот отчет об ошибке в журнале консоли.

2014-10-18 12:07:34.400 soundtest[17081:818922] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<soundtest.ViewControllerTwo 0x7f92f1f20090> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key sfdfa.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001067813f5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001082afbb7 objc_exception_throw + 45
    2   CoreFoundation                      0x0000000106781039 -[NSException raise] + 9
    3   Foundation                          0x0000000106b984d3 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 259
    4   CoreFoundation                      0x00000001066cb400 -[NSArray makeObjectsPerformSelector:] + 224
    5   UIKit                               0x00000001072ce97d -[UINib instantiateWithOwner:options:] + 1506
    6   UIKit                               0x000000010712f698 -[UIViewController _loadViewFromNibNamed:bundle:] + 242
    7   UIKit                               0x000000010712fc88 -[UIViewController loadView] + 109
    8   UIKit                               0x000000010712fef9 -[UIViewController loadViewIfRequired] + 75
    9   UIKit                               0x000000010713038e -[UIViewController view] + 27
    10  UIKit                               0x00000001076cd83f -[_UIFullscreenPresentationController _setPresentedViewController:] + 65
    11  UIKit                               0x000000010710bc49 -[UIPresentationController initWithPresentedViewController:presentingViewController:] + 105
    12  UIKit                               0x000000010713c121 -[UIViewController _presentViewController:withAnimationController:completion:] + 1746
    13  UIKit                               0x000000010713e461 __62-[UIViewController presentViewController:animated:completion:]_block_invoke + 132
    14  UIKit                               0x000000010713e385 -[UIViewController presentViewController:animated:completion:] + 229
    15  UIKit                               0x00000001073bb9d6 _UIGestureRecognizerSendActions + 262
    16  UIKit                               0x00000001073ba679 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 532
    17  UIKit                               0x00000001073bf296 ___UIGestureRecognizerUpdate_block_invoke662 + 51
    18  UIKit                               0x00000001073bf192 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 254
    19  UIKit                               0x00000001073b520d _UIGestureRecognizerUpdate + 2796
    20  UIKit                               0x00000001070520a6 -[UIWindow _sendGesturesForEvent:] + 1041
    21  UIKit                               0x0000000107052cd3 -[UIWindow sendEvent:] + 667
    22  UIKit                               0x000000010701fae1 -[UIApplication sendEvent:] + 246
    23  UIKit                               0x000000010702cbad _UIApplicationHandleEventFromQueueEvent + 17370
    24  UIKit                               0x0000000107008233 _UIApplicationHandleEventQueue + 1961
    25  CoreFoundation                      0x00000001066b6ad1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    26  CoreFoundation                      0x00000001066ac99d __CFRunLoopDoSources0 + 269
    27  CoreFoundation                      0x00000001066abfd4 __CFRunLoopRun + 868
    28  CoreFoundation                      0x00000001066aba06 CFRunLoopRunSpecific + 470
    29  GraphicsServices                    0x000000010a1699f0 GSEventRunModal + 161
    30  UIKit                               0x000000010700b550 UIApplicationMain + 1282
    31  soundtest                           0x000000010624503e top_level_code + 78
    32  soundtest                           0x000000010624507a main + 42
    33  libdyld.dylib                       0x000000010ae4a145 start + 1
    34  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 
Ник
источник
8
Скорее всего, вы подключили что-то в NIB, которого больше не существует. Похоже, сбой происходит, когда загружается представление, к которому вы пытаетесь перейти. Я бы проверил все розетки на панели инспектора (справа) и убедился, что они присутствуют? Это также может произойти, если вы подключили кнопку к IBAction, который больше не существует (или был переименован)
cmyr
Там нет ничего, что не используется, и это все еще дает мне ошибку.
Ник
Если вы используете Xcode 8 с прежним режимом Swift 2.3, посмотрите этот ответ: stackoverflow.com/a/39548326/5175709
Honey
6
В общем, всегда переходите на консоль, нажимайте, cmmd + Fчтобы вы могли искать внутри консоли и искать завершающее приложение из-за необработанного исключения , ровно через 1 строку вы увидите причину: которая сообщает вам причину сбоя вашего приложения. (да, у меня была эта ошибка слишком много раз :)
Милый
1
Также может быть полезно создать исключительную точку останова в Debug-> Breakpoints. Затем мы надеемся, что отладчик остановится на той строке кода, где находится проблема.
Чак Борис

Ответы:

394

CMYR - «это также может произойти, если вы подключили кнопку к IBAction, который больше не существует (или был переименован)»

Если вы столкнулись с этой проблемой, убедитесь, что вы идете на Main.storyboard, ВПРАВО щелкните по значку желтого поля (просмотр контроллера) в верхней части контура телефона и УДАЛИТЕ розетку (и) с желтыми флагами.

В таких случаях вы, вероятно, назвали действие, а затем переименовали его. Вам нужно удалить старое имя, и если это была единственная проблема, она запустится прямо в симе!

введите описание изображения здесь

Trapp
источник
9
Отличный ответ, спасибо! Это серьезный недостаток XCode. Обработка ошибок требует большой разработки.
HyperionX
3
У меня также была проблема с желтыми треугольниками, но исправление только этих треугольников не решило проблему для меня. :(
Андрей
Это случилось со мной после переименования @IBOutlet это было
Мохаммед Fadhl
Стоит ли дважды проверить, включен ли раскадровка в Target или нет
hoangtuanfithou
Просто просмотрите ссылки на розетки и действия в Инспекторе соединений на раскадровке
Альваро Агуэро,
95

Вы случайно установили переменную OS_ACTIVITY_MODE? Чтобы проверить, установлена ​​ли у вас эта переменная (и отключена ли она), в Xcode 9 сделайте следующее:

Select from Xcode menu Product -> Scheme -> Edit Scheme.. Select the Run scheme and look under Arguments. If you see the OS_ACTIVITY_MODE variable checked, deselect it

Сиддеш Махадешвар
источник
1
Спасибо! Из-за этого я не увидел причину сбоя: «нераспознанный селектор отправлен в класс»
Денис Кутлубаев
14
Хорошее горе, Apple. Их нефиксированные ошибки ОС вынуждают нас включить это, и тогда мы пропускаем важные важные сообщения отладки. Хороший улов, Сиддеш.
конец
Спасибо, я добавил эту переменную некоторое время назад и забыл отключить ее. Ты сделал это!
Родриго Ресио
1
Вау, спасибо, без этого я бы никогда не поймал свою жучку. Да,
черт
На самом деле. Спасибо!
Senocico Stelian
86

В Xcode 9 и Swift 4:

Напечатайте стек исключений, чтобы узнать причину исключения:

  1. Перейти к показу точки останова навигатора.
  2. Добавить (+) Добавить исключительную точку останова.

  3. Выберите новую точку останова, Control-Click, Изменить точку останова.

  4. Добавить действие и ввести: po $ arg1

введите описание изображения здесь

Ахмед Лотфи
источник
3
Следует отметить, что Действие должно быть «Командой отладчика», поскольку существуют различные варианты того, какое действие следует предпринять при создании исключения. Но это действительно помогло мне! Спасибо!
Тодд
Лучший ответ! Иногда я получал эту ошибку глубоко в стручках или библиотеках без какой-либо дополнительной информации. После того, как я прочитал ваш ответ несколько месяцев назад, я использовал его много раз, и он помог мне каждый раз.
user8675
1
Этот ответ должен быть указан как «как заставить работать отладчик Xcode»
Pier Giorgio Misley
Определенно лучший ответ, он мне очень помог.
Окан Куртулуш
8

В моем случае я вызывал метод делегата, но метод не был объявлен.

Эта ошибка является общей и может появиться по ряду причин. Убедитесь, что вы не отключили свои журналы, чтобы увидеть, что на самом деле произошло. Включите OS_ACTIVITY_MODE в схемах, если вы отключили его. Вы могли бы отключить его, чтобы предотвратить много ненужных журналов, но они удобны.

Вы также можете отследить причину более подробно, добавив точку останова исключения po $arg1. Как уже упоминалось Ахмед-Лотфи

Вот общий контрольный список, который вы можете пройти.

2) Check if you have renamed an IBOutlet and calling it
3) Check if you have renamed a method name or the method doesn't exist
4) Check if you are trying to add or remove any view from hierarchy
5) Check for any missing framework or library
6) Check if you’ve forgot to register your custom cell identifier
7) Check for any missing flag in the Proejct Setting (-obj) or any other linker flag etc.
Навид Аббас
источник
1
Хороший список! В моем случае я забыл зарегистрировать идентификатор своей пользовательской ячейки. Возможно, стоит добавить в свой список, поскольку это может быть простая вещь, которую довольно легко забыть.
luismgb
7

Другие решения не сработали, вот мое. Это относится только к Xcode 8 при работе в старом режиме Swift 2.3 :

Похоже, Интерфейсный Разработчик пытается переименовать метод, который должен быть подключен к кнопке.

Вот радар с более подробной информацией.

Решение (обходной путь) - вручную заменить имя параметра метода на _:

@IBAction func editPictureTapped(sender: UIButton) {  // not working
    print("Tapped")
}

Изменить на это:

@IBAction func editPictureTapped(_: UIButton) {     // working OK
    print("Tapped")
}
Andrej
источник
5

Также может быть неверно имя идентификатора Segue. Например -

performSegueWithIdentifier("wrongSegueName", sender: self)
M_R_K
источник
4

Моя ситуация была немного другой, я пытался перейти в a UINavigationController, и что исправило это для меня, так это получение основной части очереди.

Для Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{
    [self performSegueWithIdentifier:@"SegueName" sender:self];
});

Для Swift 3:

DispatchQueue.main.async { [weak self] in
    self?.performSegue(withIdentifier: "SegueName", sender: self)
}
Саймон
источник
3

Это начало происходить для меня на Xcode 7, и у меня не было розеток с желтыми флагами, которые я мог бы удалить.

Единственное, что сработало для меня, это замена этой строки в AppDelegate:

[window addSubview:viewController.view];

чтобы:

[window setRootViewController:viewController];
Эран Талмор
источник
3

Для меня проблема была в моем IBAction с UIButton.

Когда вы нажимаете Ctrl + Drag, чтобы создать IBAction из UIButton, обязательно выберите «UIButton» в раскрывающемся списке «Тип». Выбор по умолчанию AnyObject приводит к сбою приложения при нажатии на кнопку UIB.

введите описание изображения здесь

Крис Ливдаль
источник
У меня был Action Type установлен на AnyObject, но в моем случае это не сработало.
Андрей
Если вы читаете мой пост, я подчеркиваю, что AnyObject не работает, как вы обнаружили.
Крис Ливдал
3

Это также могут быть сломанные триггерные сегменты, проверьте раскадровку, как только вы снова подключите сегменты или розетку, все должно снова заработать.

Проверьте Segues

Убедитесь, что Identifierиз Segue правильно и похоже на ваш код .

введите описание изображения здесь

Минусы Булакена
источник
2

Я столкнулся с этой проблемой, когда я изменил имя переменной, которая подключена к одной из моих кнопок. Так что имейте это в виду!

Сами
источник
2

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

Решение, которое я нашел, заключалось в том, что нам нужно указать «Добавить к целям»: отметьте проект для добавления, когда мы импортируем файл xls в Xcode, перетаскивая его в «Проект» -> «Вспомогательные файлы».

Марк Хор
источник
1

может быть более 1 IBAction для кнопки в вашем контроллере представления, попробуйте найти их и удалить все предыдущие элементы для этой кнопки в вашем контроллере и создать новую кнопку. Это решит вашу проблему.

Амит Верма
источник
1

Убедитесь, что вы динамически не применяете относительные ограничения к представлению, которого еще нет в иерархии представлений.

UIView *bottomView = [[UIView alloc] initWithFrame:CGRectZero];
[self.view addSubview:bottomView];

bottomConstraint = [NSLayoutConstraint constraintWithItem:bottomView
                                                attribute:NSLayoutAttributeBottom
                                                relatedBy:NSLayoutRelationEqual
                                                   toItem:self.view
                                                attribute:NSLayoutAttributeBottom
                                               multiplier:1
                                                 constant:0];
bottomConstraint.active = YES;

В приведенном выше примере bottomView стал частью иерархии представления перед применением относительных ограничений к нему.

Vipin
источник
1

Я получил эту ошибку следующими 2 способами:

Я получал эту ошибку, когда я вставлял в другой UIViewController.

ОДНАКО по ошибке я переклассифицировал другой класс UITabBarControllerи получал эту ошибку.

Как я это исправил? Я из подкласса UIViewControllerи больше не рухнул :)


Я не хотел использовать раскадровку. Поэтому я удалил это. Еще я забыл удалить его ссылку в настройках проекта . Я просто нажал на проект >> Общие >> Информация о развертывании >>, а затем я установил Главный интерфейс на черное пространство. (Ранее было установлено, чтобы основной)

Как вы можете видеть в обеих ситуациях, вы получаете ошибку при доступе к некоторому объекту, который существует ...

Мед
источник
1

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

Идентификатор ячейки TableView. Прежде всего убедитесь, что ваша ячейка имеет идентификатор. Во-вторых, убедитесь, что вы ссылаетесь на этот идентификатор при удалении из ячейки.

Время росы
источник
1

Свифт 4 :

Я получил эту ошибку из-за изменения в API UIVisualEffectView. В Swift 3 было нормально сделать это: myVisuallEffectView.addSubview(someSubview)

Но в Swift 4 мне пришлось изменить это на следующее: myVisualEffectView.contentView.addSubview(someSubview)

lonesomewhistle
источник
1

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

budidino
источник
0

Для моего случая, Xcode 8.2.1 , у меня был Map Kit View в контроллере представления. Итак, я пошел в

Этапы сборки> Связать двоичные файлы с библиотеками

и добавил MapKit.framework, тогда все было хорошо.

Я думаю, что это также будет относиться к другим взглядам, которые требуют основы.

PS Запуск на iOS 9 сказал мне, что была проблема с Map Kit View, а на iOS 10 ничего не сказал!

Protocole
источник
0

У меня работало только решение "drop armageddon":

  • удалить приложение с устройства
  • чистый проект
  • запустить новую установку на устройстве
Хуан Фрэн Хименес
источник
0

В моем случае это был XCode, который устал и не запускал приложение с этим сообщением из-за сбоя утверждения (которое было установлено нашим кодом).

Запуск на другом устройстве показал ошибку подтверждения, которую мы смогли исправить, и все вернулось на круги своя.

Эге Акпинар
источник
0

Для Swift 2.3

Это похоже на ошибку в Xcode 8 и Swift 2.3, если вы подключаете действие кнопки к своему коду через раскадровку, убедитесь, что Xcode не переименовал действие, для меня это добавление withSender: в конце методов Итак, я собираюсь перейти к своему коду и переименовать метод в соответствии с написанным Xcode.

Для любой другой версии проверьте правильный ответ.

Фернандо Мата
источник
0

В моем случае это был InterfaceBuilder. Я скопировал некоторые виды из другого ViewController, который испортил ограничения.

В InterfaceBuilder у меня была ошибка красной стрелки на ViewController.

Во время выполнения приложение упало.

Винсент
источник
0

В моем случае приложение упало, потому что я не установил целевое членство в раскадровке.

fredpi
источник
0

В моем случае проект Build Settingsсодержал несколько несуществующих каталогов для Framework Search Pathsи Library Search Paths.

Manuel
источник
0

У меня было две проблемы:

1) У моей цели не было контроллера просмотра, который использовался в файле раскадровки.

2) Моей раскадровке было около 3 лет, мне пришлось заново создать один из контроллеров представления в контроллере панели вкладок (на нем был только UITextField, и я до сих пор не знаю, почему он не работал)

Genki
источник
0

Еще одна возможная причина:

В моем случае у меня xibбыл звонок, и Bundle.main.loadNibNamed(...в этот момент он падал. Все по моему IBOutletsи IBActionsвроде нормально. В конце я заметил, что на nibсамом деле загружается, но когда я попытался получить доступ к первому (и единственному) представлению ( nib.first), это не сработало. На самом деле nib.countвозвращалось очень большое целое число (max int?) Вместо ожидаемого1 . Я попытался повторно добавить представление, но все равно не повезло.

В итоге я удалил весь xib файл и начал заново (но я сохранил некоторые представления в своем буфере обмена, чтобы я мог вставить их вместо того, чтобы заново создавать их).

Это сработало!

Николай Суванджиев
источник
0

Это может произойти, если у вас есть таблица и вы забыли назначить классу UITableViewDelegate и UITableViewDataSource

user3561494
источник