libc ++ abi.dylib: kończenie z nieprzechwyconym wyjątkiem typu NSException (lldb)


186

Programuję aplikację szybko i po uruchomieniu aplikacji testowej na symulatorze iPhone'a wszystko działa, ale potem próbuję przesunąć w prawo, co jest gestem, który dodałem, aby przejść do następnej strony (Zobacz kontroler drugi) ulega awarii i pokazuje ten raport o błędach w dzienniku konsoli.

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
Najprawdopodobniej podłączyłeś coś do NIB, którego już nie ma. Wygląda na to, że awaria występuje, gdy ładowany jest widok, do którego próbujesz przejść. Sprawdziłbym wszystkie gniazda w panelu inspektora (po prawej) i upewnił się, że są obecne? Może się to również zdarzyć, jeśli
podłączysz

Nie ma nic, co nie byłoby używane i nadal daje mi błąd.
Nick

Jeśli używasz Xcode 8 ze starszym trybem Swift 2.3, zobacz następującą odpowiedź: stackoverflow.com/a/39548326/5175709
Honey

6
Ogólnie rzecz biorąc, zawsze idź do konsoli, naciśnij, cmmd + Faby móc przeszukiwać konsolę i szukać aplikacji kończącej z powodu nieprzechwyconego wyjątku , dokładnie 1 wiersz po tym zobaczysz przyczynę: która mówi o przyczynie awarii aplikacji. (tak, miałem ten błąd zbyt wiele razy :)
Kochanie,

1
Pomocne może być również utworzenie punktu przerwania wyjątku w Debug-> Punkty przerwania. Mam nadzieję, że debugger powinien zatrzymać się na linii kodu, w której znajduje się problem.
Chuck Boris

Odpowiedzi:


392

CMYR - „może się również zdarzyć, jeśli podłączysz przycisk do IBAction, który już nie istnieje (lub został przemianowany)”

Jeśli napotykasz ten problem, upewnij się, że idziesz do Main.storyboard, PRAWO kliknij ikonę żółtego pola (kontroler widoku) u góry konspektu telefonu i USUŃ gniazdka z żółtymi flagami.

To, co dzieje się w takich przypadkach, to prawdopodobnie nazwa działania, a następnie zmiana jego nazwy. Musisz usunąć starą nazwę, a jeśli to był jedyny problem, rozpocznie się od razu w SIM!

wprowadź opis zdjęcia tutaj


9
Świetna odpowiedź, dziękuję! To POWAŻNA wada XCode. Obsługa błędów wymaga wielu zmian.
HyperionX

3
Miałem też problem z żółtymi trójkątami, ale naprawienie tylko tych trójkątów nie rozwiązało dla mnie awarii. :(
Andrej

Stało się tak po zmianie nazwy @IBOutlet, to było
Mohammed Fadhl

Należy dokładnie sprawdzić, czy scenorys jest dołączony do celu, czy nie
hoangtuanfithou

Wystarczy przejrzeć odniesienia do rynków zbytu i działań w Connections Inspector na scenorysie
Álvaro Agüero,

95

Czy ustawiłeś zmienną OS_ACTIVITY_MODE przez przypadek? Aby sprawdzić, czy ta zmienna jest ustawiona (i ją wyłączyć), w Xcode 9 wykonaj następujące czynności:

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
Dzięki! Nie widziałem powodu awarii z tego powodu: „nierozpoznany selektor wysłany do klasy”
Denis Kutlubaev

14
Żałoba, Apple. Ich nierozwiązane błędy w systemie operacyjnym zmuszają nas do włączenia tego, a następnie brakuje nam ważnych ważnych wiadomości debugujących. Niezły chwyt, Siddhesh.
Nate

Dzięki, dodałem tę zmienną jakiś czas wcześniej i zapomniałem ją wyłączyć. Udało wam się!
Rodrigo Recio,

1
Wow dzięki, bez tego nigdy nie złapałbym mojej lil bug. Tak, pieprzyć Apple'a za wszystkie informacje o debugowaniu przy przewijaniu
ShadowLightz,

W rzeczy samej. Dzięki!
Senocico Stelian

86

W Xcode 9 i Swift 4:

Wydrukuj stos wyjątków, aby poznać przyczynę wyjątku:

  1. Przejdź do pokazu nawigatora punktu przerwania.
  2. Dodaj (+) Dodaj punkt przerwania wyjątku.

  3. Wybierz nowy punkt przerwania, kliknij z wciśniętym klawiszem Control, edytuj punkt przerwania.

  4. Dodaj akcję i wprowadź: po $ arg1

wprowadź opis zdjęcia tutaj


3
Należy zauważyć, że Akcja musi być „komendą debuggera”, ponieważ istnieją różne opcje tego, jaką akcję należy podjąć, zgłaszając wyjątek. Ale to naprawdę mi pomogło! Dzięki!
Todd

Najlepsza odpowiedź! Czasami dostaję ten błąd głęboko w strąkach lub bibliotekach bez dalszych informacji. Po przeczytaniu twojej odpowiedzi kilka miesięcy temu użyłem jej wiele razy i pomogło mi to za każdym razem.
user8675

1
Ta odpowiedź powinna zostać wskazana jako „jak sprawić, by debugger Xcode działał”
Pier Giorgio Misley,

Zdecydowanie najlepsza odpowiedź, bardzo mi pomogła.
Okan Kurtuluş

8

W moim przypadku wywołałem metodę delegowaną, ale metoda ta nie została zadeklarowana.

Ten błąd jest ogólny i może pojawić się z wielu powodów. Upewnij się, że nie wyłączyłeś swoich dzienników, aby zobaczyć, co się stało. Włącz OS_ACTIVITY_MODE w schematach, jeśli ją wyłączyłeś. Możliwe, że został wyłączony, aby zapobiec wielu niepotrzebnym dziennikom, ale są one przydatne.

Możesz także prześledzić przyczynę bardziej szczegółowo, dodając punkt przerwania wyjątku po $arg1. Jak już wspomniano Ahmed-Lotfi

Oto wspólna lista kontrolna, przez którą można przejść.

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
Ładna lista! W moim przypadku zapomniałem zarejestrować identyfikator mojej niestandardowej komórki. Warto dodać do listy, ponieważ może to być prosta rzecz, o której łatwo zapomnieć.
luismgb

7

Inne rozwiązania nie działały u mnie, oto moje. Dotyczy tylko Xcode 8, gdy działa w starszym trybie Swift 2.3 :

Wygląda na to, że Konstruktor interfejsów próbuje zmienić nazwę metody, którą należy podłączyć do przycisku.

Oto radar z dodatkowymi szczegółami.

Rozwiązaniem (obejście) jest ręczne zastąpienie nazwy parametru metody na _:

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

Zmień na:

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

5

Może to być również niepoprawna nazwa identyfikatora segmentu. Np. -

performSegueWithIdentifier("wrongSegueName", sender: self)

4

Moja sytuacja była trochę inna, starałem się segregować w UINavigationController , a to, co mnie naprawiło, to zdobycie głównej kolejki.

Dla celu C:

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

W przypadku Swift 3:

DispatchQueue.main.async { [weak self] in
    self?.performSegue(withIdentifier: "SegueName", sender: self)
}

3

Zdarzyło mi się to na Xcode 7 i nie miałem gniazdek z żółtymi flagami, które mogłem usunąć.

Jedyną rzeczą, która działała dla mnie, było zastąpienie tej linii w AppDelegate:

[window addSubview:viewController.view];

do:

[window setRootViewController:viewController];

3

Dla mnie problemem był mój IBAction z przyciskiem UIB.

Kiedy Ctrl + Przeciągnij, aby utworzyć IBAction z UIButton, pamiętaj, aby wybrać „UIButton” z menu rozwijanego Typ. Domyślny wybór AnyObject powoduje awarię aplikacji po dotknięciu przycisku UIB.

wprowadź opis zdjęcia tutaj


Miałem Typ akcji ustawiony na AnyObject, ale w moim przypadku nie działał.
Andrej

Jeśli czytasz mój post, zwracam uwagę, że AnyObject nie działa, jak zauważyłeś.
Chris Livdahl,

3

Może to być również uszkodzony Segmenty wyzwalane, sprawdź w swojej scenorysie, gdy tylko ponownie połączysz sekwensy lub ujdziesz, wszystko powinno znowu działać.

Sprawdź segmenty

Upewnij się, że IdentifierSegue jest poprawny i podobny do Twojego kodu .

wprowadź opis zdjęcia tutaj


2

Natknąłem się na ten problem, kiedy zmieniłem nazwę zmiennej, która była podłączona do jednego z moich przycisków. Miej to na uwadze!


2

Jestem nowy w Xcode, więc zajęło mi kilka godzin, aby znaleźć problem, aby załadować plik xls. Prześledziłem większość przykładowych kodów tam i żaden z nich nie rozwiązuje pokazanego błędu Xcode.

Rozwiązaniem, które znalazłem, było określenie „Dodaj do celów:” zaznacz projekt, który chcesz dodać, gdy importujemy plik xls do Xcode, przeciągając go i upuszczając w Projekt -> Pliki pomocnicze.


1

może być więcej niż 1 IBAction dla przycisku w kontrolerze widoku, spróbuj je znaleźć i usunąć wszystkie poprzednie pozycje dla tego przycisku w kontrolerze i utwórz nowy przycisk. To rozwiąże problem.


1

Upewnij się, że dynamicznie nie stosujesz względnych ograniczeń do widoku, którego jeszcze nie ma w hierarchii widoku.

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;

W powyższym przykładzie bottomView został włączony do hierarchii widoków przed zastosowaniem względnych ograniczeń.


1

Wystąpił ten błąd na 2 następujące sposoby:

Ten błąd pojawiał się, gdy przepychałem inny kontroler UIViewController.

JEDNAK przez pomyłkę podklasowałem drugą klasę UITabBarController i otrzymywałem ten błąd.

Jak to naprawić? Podklasowałem UIViewControlleri już się nie zawieszałem :)


Nie chciałem używać scenorysu. Więc go usunąłem. Jednak zapomniałem usunąć odniesienie w ustawieniach projektu . Właśnie kliknąłem projekt >> Ogólne >> Informacje o wdrożeniu >>, a następnie ustawiłem interfejs główny na czarną przestrzeń. (Wcześniej był ustawiony na główny)

Jak widać w obu sytuacjach, pojawia się błąd dostępu do jakiegoś obiektu, który istnieje ...


1

Dodam mój problem do listy możliwych rozwiązań na wypadek, gdyby ktoś spotkał się z tym wątkiem.

Identyfikator komórki TableView. Po pierwsze upewnij się, że twoja komórka ma identyfikator. Po drugie, upewnij się, że odwołujesz się do tego identyfikatora podczas usuwania z kolejki komórki.


1

Swift 4 :

Otrzymałem ten błąd z powodu zmiany interfejsu API UIVisualEffectView. W Swift 3 można było to zrobić: myVisuallEffectView.addSubview(someSubview)

Ale w Swift 4 musiałem to zmienić na: myVisualEffectView.contentView.addSubview(someSubview)


1

Miałem ten sam błąd, gdy miałem literówkę w jednym z widoków podczas budowania ograniczeń za pomocą formatera wizualnego. Mam nadzieję, że to pomoże komuś ... lub mnie jeszcze raz.




0

W moim przypadku, Xcode 8.2.1 , miałem kontroler widoku widoku mapy . Więc poszedłem do

Fazy ​​kompilacji> Połącz pliki binarne z bibliotekami

i dodał MapKit.framework, to było w porządku.

Myślę, że będzie to miało również zastosowanie do innych poglądów, które wymagają ram.

PS Działający na iOS 9 powiedział mi, że wystąpił problem z Map Kit View, a na iOS 10 nic mi nie powiedział!


0

Tylko rozwiązanie „drop armageddon” działało dla mnie:

  • usuń aplikację z urządzenia
  • czysty projekt
  • uruchom nową instalację na urządzeniu

0

W moim przypadku XCode zmęczył się i nie uruchomił aplikacji z tym komunikatem z powodu niepowodzenia asercji (ustawionego przez nasz kod).

Uruchomienie na innym urządzeniu pokazało błąd asercji, który udało nam się naprawić, i wszystko wróciło do normy.


0

Dla Swift 2.3

Wygląda na to, że jest to błąd w Xcode 8 i Swift 2.3, jeśli łączysz akcję przycisku ze swoim kodem za pomocą scenorysu, upewnij się, że Xcode nie zmienił nazwy akcji, dla mnie to dodaje withSender: na końcu metod , więc robię kod i zmieniam nazwę metody, aby pasowała do tej, którą napisał Xcode.

W przypadku każdej innej wersji sprawdź poprawną odpowiedź.


0

W moim przypadku był to InterfaceBuilder. Skopiowałem niektóre widoki z innego ViewController, który pomieszał ograniczenia.

W InterfaceBuilder miałem błąd czerwonej strzałki na ViewController.

Podczas wykonywania aplikacja uległa awarii.


0

W moim przypadku aplikacja uległa awarii, ponieważ nie ustawiłem docelowego członkostwa scenorysu.


0

W moim przypadku projekt Build Settingszawierał nieistniejące katalogi dla Framework Search Pathsi Library Search Paths.


0

Miałem dwa problemy:

1) Mój cel nie zawierał kontrolera widoku, który był używany w pliku scenorysu.

2) Mój scenorys miał około 3 lat, musiałem odtworzyć jeden z kontrolerów widoku w kontrolerze paska kart od zera (miał tylko UITextField i nadal nie wiem, dlaczego to nie działało)


0

Jeszcze inna możliwa przyczyna:

W moim przypadku miałem xibi dzwoniłem, Bundle.main.loadNibNamed(...w którym momencie się zawiesił. Wszystko moje IBOutletsi IBActionswydawało się w porządku. W końcu zauważyłem, że nibfaktycznie się ładuje, ale kiedy próbowałem uzyskać dostęp do pierwszego (i jedynego) widoku ( nib.first), to nie działało. W rzeczywistości nib.countzwracano bardzo dużą liczbę całkowitą (max int?) Zamiast oczekiwanej1 . Próbowałem ponownie dodać widok, ale nadal nie miałem szczęścia.

Na koniec usunąłem cały xibplik i zacząłem od nowa (ale zachowałem niektóre widoki w moim schowku, więc mogę je wkleić zamiast odtwarzać ponownie).

To zadziałało!


0

Może się to zdarzyć, jeśli masz tabelę i zapomnisz przypisać do klasy UITableViewDelegate i UITableViewDataSource

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.