libc ++ abi.dylib: завершення з винятковим винятком типу NSException (lldb)


186

Я швидко програмую додаток, і коли запускаю тестовий додаток на iPhone-симуляторі, все працює, але потім я намагаюся провести пальцем праворуч, що є жестом, який я додав для цього, щоб перейти до наступної сторінки (Переглянути контролер два) він виходить з ладу і показує цей звіт про помилку в журналі консолі.

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
Також може бути корисно створити пункт « Виключення точки перерви» в «Налагодження» - «Точки перерви». Тоді налагоджувач повинен сподіватися зупинитися на рядку коду, де знаходиться проблема.
Чак Борис

Відповіді:


392

CMYR - "його також може статися, якщо ви підключили кнопку до IBAction, яка більше не існує (або перейменована)"

Якщо ви зіткнулися з цією проблемою, переконайтесь, що ви переходите до Main.storyboard, клацніть правою кнопкою миші на значку жовтого поля (контролер перегляду) у верхній частині контуру телефону та видаліть розетки з жовтими прапорами.

Що трапляється в таких випадках, ви, ймовірно, назвали дію, а потім перейменували її. Вам потрібно видалити старе ім'я, і ​​якщо це був єдиний випуск, він почне працювати в сім!

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


9
Чудова відповідь, дякую! Це СЕРІЙНА вада з XCode. Поводження з помилками потребує значного розвитку.
HyperionX

3
У мене також виникли проблеми з жовтими трикутниками, але виправлення саме цих трикутників не вирішило краху для мене. :(
Андрій

Це сталося зі мною після перейменування @IBOutlet, це було
Мохаммед Фадл

Якщо двічі перевірити, чи є
дошка розкадрівки

Просто перегляньте посилання на торговельні точки та дії в Інспекторі підключень на
Альваро

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
Чудово дякую, без цього я ніколи не зловив би свою помилку. Так,
гвинтить

Справді. Дякую!
Сенокіко Стеліан

86

У Xcode 9 та Swift 4:

Роздрукуйте стек винятків, щоб знати причину виключення:

  1. Перейдіть, щоб показати навігатор точки перерви.
  2. Додати (+) Додати точку розриву винятку.

  3. Виберіть нову точку розриву, клацніть Control, натисніть кнопку Edit Edit Breakpoint.

  4. Додати дію та ввести: po $ arg1

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


3
Слід зазначити, що Дія повинна бути «командою налагодження», оскільки існують різні варіанти того, яку дію потрібно зробити для викидання виключення. Але це мені справді допомогло! Дякую!
Тодд

Найкраща відповідь! Іноді я отримував цю помилку глибоко в стручках або губах без додаткової інформації. Після того, як я прочитав вашу відповідь місяці тому, я користувався нею багато разів, і мені це допомагало щоразу.
користувач8675

1
Цю відповідь слід вказати як "як змусити роботу налагоджувача Xcode"
П'єр Джорджіо Міслі

Однозначно найкраща відповідь, мені це дуже допомогло.
Окан Куртулуш

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 :

Схоже, що Інтерфейс Builder намагається перейменувати метод, який слід підключити до кнопки.

Ось радар з більш детальною інформацією.

Рішення (вирішення) полягає в ручній заміні імені параметра методу на _:

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

Змініть це:

@IBAction func editPictureTapped(_: UIButton) {     // working OK
    print("Tapped")
}

5

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

performSegueWithIdentifier("wrongSegueName", sender: self)

4

Моя ситуація була дещо іншою, я намагався перенести на себе 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 + перетягніть для створення IBAction з UIButton, переконайтесь, що виберіть "UIButton" зі спадного меню Type. Вибір за замовчуванням AnyObject спричиняє збій програми, коли ви натискаєте кнопку UIB.

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


У мене було встановлено Тип дії на AnyObject, але в моєму випадку це не спрацювало.
Андрій

Якщо ви читаєте мій пост, я зазначаю, що AnyObject не працює, як ви знайшли.
Кріс Лівдах

3

Це також може бути зламаний спрацьований сег, перевірте у своєму раскадровці, як тільки ви знову підключите сеги або вийдіть, все це має працювати знову.

Перевірте Segues

Переконайтеся, що Identifierправильність Segue правильна та схожа на ваш код .

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


2

Я зіткнувся з цим питанням, коли змінив назву змінної, яка підключилася до однієї з моїх кнопок. Тож майте це на увазі!


2

Я новачок у Xcode, тому мені знадобилося кілька годин, щоб розібратися з проблемою, щоб завантажити файл xls. Я дотримувався більшості зразків кодів там, і жоден з них не вирішує показаний Xcode помилки.

Я знайшов рішення, що нам потрібно вказати "Додати в цілі:" проект, який потрібно додати, коли ми імпортуємо файл xls у Xcode шляхом перетягування у Project -> Supporting Files.


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 став частиною ієрархії перегляду перед застосуванням відносних обмежень.


1

Я отримав цю помилку двома способами:

Я отримував цю помилку, коли натискав на інший UIViewController.

ЯКЩО помилково я підкласифікував інший клас UITabBarControllerі отримував цю помилку.

Як я це виправив? Я підкласифікував UIViewControllerі більше не врізався :)


Я не хотів використовувати раскадровку. Тому я її видалив. Але я забуваю видалити його посилання в налаштуваннях проекту . Я просто натиснув на проект >> Загальні >> Інформація про розгортання >>, і тоді я встановив Головний інтерфейс на чорний пробіл. (Раніше було встановлено основний)

Як ви бачите, для обох ситуацій ви отримуєте помилку для доступу до якогось об'єкта, який існує ...


1

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

Ідентифікатор комірки TableView. Спочатку переконайтеся, що у вашій комірці є ідентифікатор. По-друге, переконайтеся, що ви посилаєтесь на цей ідентифікатор, коли ви знімаєте комірок.


1

Швидкий 4 :

Я отримав цю помилку через зміну api UIVisualEffectView. У Swift 3 це було нормально: myVisuallEffectView.addSubview(someSubview)

Але в Swift 4 мені довелося змінити це на це: myVisualEffectView.contentView.addSubview(someSubview)


1

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




0

У моєму випадку, Xcode 8.2.1 , у мене був перегляд Map Kit у контролері подання. Тому я пішов

Фази побудови> Пов’язати бінарне з бібліотеками

і додав MapKit.framework, тоді було добре.

Я думаю, це стосуватиметься і інших поглядів, які потребують основи.

PS, що працює на iOS 9, сказав мені, що виникла проблема щодо Map Kit View, тоді як на iOS 10 мені нічого не говорили!


0

Для мене працювало лише рішення "крапля армагедон":

  • видалити додаток із пристрою
  • чистий проект
  • запустити нову інсталяцію на пристрої

0

У моєму випадку, XCode втомився і не зміг запустити програму з цим повідомленням через невдачу твердження (це було встановлено нашим кодом).

Запуск на іншому пристрої показав недосвідчення твердження, яке ми змогли виправити, і все повернулося до норми.


0

Для Swift 2.3

Це здається помилкою з Xcode 8 та Swift 2.3, якщо ви підключаєте дію кнопки до свого коду за допомогою розгортки, будьте впевнені, що Xcode не перейменував дію, для мене це додавання withSender: наприкінці методів , тому те, що я роблю, - це перейти до мого коду та перейменувати метод, щоб відповідати одному написаному Xcode

Для будь-якої іншої версії перевірте правильність відповіді.


0

У моєму випадку це був InterfaceBuilder. Я скопіював деякі погляди з іншого ViewController, який зіпсував обмеження.

У InterfaceBuilder у мене виникла помилка з червоною стрілкою на ViewController.

Під час виконання додаток вийшов з ладу.


0

У моєму випадку додаток вийшов з ладу, тому що я не встановив цільове членство в раскадровці.


0

У моєму випадку проект Build Settingsмістив деякі неіснуючі каталоги для Framework Search Pathsта Library Search Paths.


0

У мене було два випуски:

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

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


0

Ще одна можлива причина:

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

Зрештою, я видалив ціле xib файл і почав заново (але я зберег частину поглядів у своєму буфері обміну, щоб я міг вставити їх, а не відтворити їх знову).

Це спрацювало!


0

Це може статися, якщо у вас є таблиця і ви забудете призначити UITableViewDelegate та UITableViewDataSource класу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.