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

Posted

技术标签:

【中文标题】应用程序随机崩溃,NSInvalidArgumentException 无法识别的选择器发送到实例 0x800000000000000【英文标题】:App crashes randomly with NSInvalidArgumentException unrecognized selector sent to instance 0x800000000000000 【发布时间】:2019-08-21 18:45:10 【问题描述】:

我的应用使用核心数据。我最近升级到 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'

不仅我的代码可以正常工作,而且这个实例编号看起来很可疑

我的应用程序连接到 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 将所有核心数据活动移动到主线程,但没有成功。

我已经从模拟器中删除了该应用程序并重新安装它,到目前为止崩溃没有重复。 关于导致这次崩溃的任何想法?

【问题讨论】:

"-com.apple.CoreData.ConcurrencyDebug 1":在 Xcode 的方案编辑器中设置此参数以启用核心数据调试 w.r.t 线程。这也有助于确定崩溃原因。 你解决了吗?将 Xcode 升级到 10.2 或更高版本后,我遇到了几乎完全相同的问题。谢谢! 【参考方案1】:

当我同时从两个不同的线程(在我的代码中的两个不同位置)更改和访问一个对象时,我也遇到了类似的问题,地址一定是在变化的。我通过使用 DispatchQueue 来同步对该对象的访问来解决

var lock: DispatchQueue = DispatchQueue.init(label: "")

lock.sync 访问对象

【讨论】:

【参考方案2】:

这看起来像是在 Xcode 10.2 中完成的非优化构建的错误。我没有在我的应用程序中使用核心数据,它也会崩溃

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

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

【讨论】:

感谢您的想法,我会尝试的。在我的情况下,它也有不同的类型,总是具有相同的地址,尽管它通常出现在相同的代码周围。问题是它也在发布模式下发生,所以我必须检查那里发生了什么。 我遇到了这个确切的问题,但是 Optimise for speed -O 似乎没有解决这个问题。对我来说,这个问题是由于在后台线程上执行字典访问而发生的。 从后台线程访问字典有什么问题?顺便说一句,我实现了一个类似的解决方案 - 仅从指定的队列访问字典以避免冲突。我仍然希望它能解决问题。 在我的情况下,升级到 Xcode 10.2 后出现问题,我仍在使用 Swift 4.2。相同的代码库在以前版本的 Xcode 中运行没有任何问题,我正在主线程中访问字典。【参考方案3】:

您正在发送一个方法 objectForKey: 通常用于字典。然而,接收者是一个 TaggedDate 对象。 TaggedDate 与 NSDate 基本相同(出于我们的目的)。所以不知何故,你设法在你期望字典的地方拥有一个 NSDate 对象。

在异常上添加断点,这样您就可以退回到调用者,并弄清楚为什么您在期望字典的地方有一个 NSDate 对象。当 dict 原来是 NSDate 时,期待像 dict [@"some key"] 这样的行。

【讨论】:

问题是在哪里。模型中的所有实体都没有日期字段,我也没有在其中一个函数上使用日期。这也没有解释为什么更新后突然崩溃,也没有解释为什么在重新安装应用程序后没有任何更改代码就停止了。 @YoniReiss 我给你建议如何解决这个问题,你回答为什么问题不可能出现,而事实上它确实出现了。如果它因为 X 原因而崩溃,那么说“它不会因为 X 原因而崩溃”不会让你到任何地方。

以上是关于应用程序随机崩溃,NSInvalidArgumentException 无法识别的选择器发送到实例 0x800000000000000的主要内容,如果未能解决你的问题,请参考以下文章

Qwidget的背景颜色改变时程序随机崩溃

C++:当我的应用程序在随机位置崩溃时从哪里开始?

Spring MVC thymeleaf 随机崩溃

OpenGL:随机调用 OpenGL 函数时崩溃

(iOS) iPad 应用程序在启动时随机崩溃

Android 4.4 KitKat 随机崩溃