应用程序无法崩溃,并且NSInvalidArgumentException无法识别的选择器发送到实例0x800000000000000

时间:2019-03-31 12:30:56

标签: ios swift swift5

我的应用使用核心数据。我最近升级到了Xcode 10.2和Swift 5,从那以后,我收到了与核心数据有关的随机崩溃。

根据我的收集,这是在尝试从后台线程更改Core Data时发生的(从服务器中提取新数据之后)。

我收到以下错误消息

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'

不仅我的代码曾经工作过,而且此实例号看起来可疑

我的应用程序已连接到引起这些错误之一的crashlytics。 这是它捕获的堆栈跟踪:

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)

提到的所有缺少的dylib是什么?

我曾尝试使用DispatchQueue将所有Core Data活动移至主线程,但运气不佳。

我已经从模拟器中删除了该应用程序,然后重新安装了该应用程序,到目前为止,崩溃不再重复。 关于什么原因导致崩溃的任何想法?

3 个答案:

答案 0 :(得分:2)

对于在Xcode 10.2中完成的未优化的构建,它似乎是一个错误。我没有在我的应用程序中使用Core Data,它也崩溃了

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

XXX有时是__NSTaggedDate,有时是另一种类型,但地址始终是0x8000000000000000。当我通过有效的密钥访问有效的词典时,调试器会在一行上停止,这根本没有帮助。当我将调试方案的优化更改为Optimise for speed -O时,应用程序停止崩溃。

答案 1 :(得分:2)

当我同时从两个不同的线程(在我代码的两个不同位置)访问一个对象时,发生了类似的问题,地址必须一直在变化。我通过使用DispatchQueue来同步对此对象的访问来解决

var lock:DispatchQueue = DispatchQueue.init(标签:“”)

lock.sync { 访问对象 }

答案 2 :(得分:0)

您要发送的方法objectForKey:通常用于字典。但是,接收者是TaggedDate对象。 TaggedDate与NSDate基本相同(出于此处的目的)。因此,您设法在期望字典的地方有了一个NSDate对象。

在异常上添加一个断点,以便您可以退回到调用方,并弄清楚为什么在需要字典的地方有一个NSDate对象。当dict证明是NSDate时,应出现像dict [@“ some key”]之类的行。