Приложение аварийно завершает работу с нераспознанным селектором NSInvalidArgumentException, отправленным экземпляру 0x800000000000000 - PullRequest
5 голосов
/ 31 марта 2019

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

Насколько я понял, это произошло при попытке изменить базовые данные из фонового потока (после извлечения новых данных с сервера).

Я получаю следующее сообщение об ошибке

2019-03-31 14:49:17.358685+0300 LeaderMES[24226:595701] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSTaggedDate objectForKey:]: unrecognized selector sent to instance 0x8000000000000000'

Или

2019-03-31 14:37:04.676485+0300 LeaderMES[23749:583097] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSCoreDataTaggedObjectID objectForKey:]: unrecognized selector sent to instance 0x8000000000000000'

Не только мой код работал, этот номер экземпляра выглядит подозрительно

Мое приложение связано с сбоем, который обнаружил одну из этих ошибок. Вот трассировка стека, которую он поймал:

Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x1086f86e3 (Missing)
1  libobjc.A.dylib                0x10771bac5 objc_exception_throw
2  CoreFoundation                 0x108716ab4 (Missing)
3  CoreFoundation                 0x1086fd443 (Missing)
4  CoreFoundation                 0x1086ff238 (Missing)
5  libswiftCore.dylib             0x109914dcc (Missing)
6  libswiftCore.dylib             0x109b407b9 (Missing)
7  LeaderMES                      0x105080a8d closure #1 in LMNotificationRepository.loadNotificationHistory(forFactory:successCompletion:errorCompletion:) (LMNotificationRepository.swift:360)
8  LeaderMES                      0x105091271 partial apply for closure #1 in LMNotificationRepository.loadNotificationHistory(forFactory:successCompletion:errorCompletion:) (<compiler-generated>)
9  LeaderMES                      0x10510b872 closure #1 in LMHttpProvider.procedeRequest(_:completionHandler:) (LMHTTPProvider.swift:299)
10 LeaderMES                      0x10510e381 partial apply for closure #1 in LMHttpProvider.procedeRequest(_:completionHandler:) (<compiler-generated>)
11 LeaderMES                      0x1050ce176 thunk for @escaping @callee_guaranteed (@guaranteed Data?, @guaranteed NSURLResponse?, @guaranteed Error?) -> () (<compiler-generated>)
12 CFNetwork                      0x10adf6178 (Missing)
13 CFNetwork                      0x10ae0cc56 (Missing)
14 Foundation                     0x10666f412 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__
15 Foundation                     0x10666f31a -[NSBlockOperation main]
16 Foundation                     0x10666c1f4 -[__NSOperationInternal _start:]
17 Foundation                     0x106671f5b __NSOQSchedule_f
18 libdispatch.dylib              0x10a539ccf (Missing)
19 libdispatch.dylib              0x10a53ad02 (Missing)
20 libdispatch.dylib              0x10a53d6be (Missing)
21 libdispatch.dylib              0x10a53cd49 (Missing)
22 libdispatch.dylib              0x10a549ad3 (Missing)
23 libdispatch.dylib              0x10a54a330 (Missing)
24 libsystem_pthread.dylib        0x10a91c6b3 (Missing)
25 libsystem_pthread.dylib        0x10a91c3fd (Missing)

Какие все упомянутые пропавшие дилибы?

Я безуспешно пытался перенести всю активность Core Data в основной поток с помощью DispatchQueue.

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

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Это похоже на ошибку для неоптимизированных сборок, сделанных в Xcode 10.2. Я не использую базовые данные в своем приложении, и оно также вылетает при

-[xxx objectForKey:]: unrecognized selector sent to instance 0x8000000000000000'

XXX иногда равен __NSTaggedDate, иногда это другой тип, но адрес всегда 0x8000000000000000. Отладчик останавливается на строке, когда я получаю доступ к действительному словарю по действительному ключу, и это совсем не полезно Приложение перестает падать, когда я изменил оптимизацию на Optimise for speed -O для схемы отладки.

0 голосов
/ 31 марта 2019

Вы отправляете метод objectForKey: который обычно используется для словарей. Получатель, однако, является объектом TaggedDate. TaggedDate в основном совпадает с NSDate (для наших целей здесь). Так что каким-то образом вам удалось получить объект NSDate, где вы ожидаете словарь.

Добавьте точку останова на исключение, чтобы вы могли вернуться к вызывающей стороне и выяснить, почему у вас есть объект NSDate, где вы ожидали словарь. Ожидайте строку типа dict [@ "some key"], когда dict оказывается NSDate.

...