EXC_BAD_INSTRUCTION 在 Swift 中为 locationManager 崩溃(经理:CLLocationManager,didUpdateLocations 位置:[CLLoca

Posted

技术标签:

【中文标题】EXC_BAD_INSTRUCTION 在 Swift 中为 locationManager 崩溃(经理:CLLocationManager,didUpdateLocations 位置:[CLLocation])【英文标题】:EXC_BAD_INSTRUCTION Crash In Swift For locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 【发布时间】:2015-09-17 22:43:00 【问题描述】:

我正在研究 GPS 功能。

我已延迟更新设置,我正在相应 GPS 委托中处理事件

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

当我尝试将路由保存到成员变量_userRoutes 时遇到了问题,该成员变量基本上是用户所采用的路由列表。 _userRoutes 在调用此代码时有效且已声明且工作正常 (100%)。

在上面的回调中我有这个代码:

            var route:Route!
            if (self._userRoutes.last?.routeType == self._currentActivityType)
            
                route = self._userRoutes.last
                route.locations = route.locations + points
                route.locationCoordinates = route.locationCoordinates + points2D
             else
            
                // Its a new route so create it
                route = Route()
                route.locations = points
                route.routeType = routeType
                route.startingCoordinate = points2D.first!
                route.startingLocation = points.first!
            

但是这段代码在

上崩溃了
            if (self._userRoutes.last?.routeType == self._currentActivityType)

有一个

EXC_BAD_INSTRUCTION

我什至尝试打印出所有变量,它们都打印得很好,然后它又返回并仍然崩溃。

正如您在下面看到的,它打印了所有 3 个打印件,然后返回 2 行以抛出崩溃错误?!

所以我想知道问题可能是什么,如果您有任何想法,我会全力以赴!为了清楚起见,我不想在查找以前的用户路线时得到 EXC_BAD_INSTRUCTION。

更新

为了更明确地检查用户路由是否为零(并且它崩溃),并且您可以看到它只打印了一次“HERE”,但它确实回到堆栈中崩溃了。

但是,如果我将 return 语句放在那里(自然),应用程序不会崩溃。

所以我可以得出的结论是,该错误是由尝试解开 nil 引起的,但在这种情况下发生崩溃时存在源映射问题。

更新 2

这是所有变量的打印输出

User Routes: [] //_userRoutes
User Route Count: 0 // _userRoutes.count
User Route last: nil // _userRoutes.last
User Route last type: nil // _userRoutes.last?.routeType

更新 3

我刚开始在 (lldb) 之前收到此消息

AppName 是经过优化编译的 - 步进可能会表现得很奇怪; 变量可能不可用。

【问题讨论】:

你可以看到 _userRoutes.last 是 nil - 当你在 if 语句中解开它时,这会给你带来问题。 但我有 ?正在使用,我不会强制展开 您正在使用可选链接,因此您不会得到“意外 nil”的异常,但是当您尝试使用 nil 值时仍然会遇到问题。在进一步操作之前,您应该确保 self._userRoutes.last?.routeType 不为零 我认为您的评估是正确的,但它被编译器掩盖了,我认为它错误地显示了日志,因为它看起来确实崩溃并返回堆栈并出现错误。否则“HERE”应该出现在(lldb)之前 如果我执行 if(_userRoutes.last == nil) 并且 _userRoutes 在此类执行任何操作之前被初始化,我也会崩溃,它只是一个数组 [] 【参考方案1】:

我认为您会感到困惑,因为您多次调用 locationManager:manager:didUpdateLocations。第一次调用的 _userRoutes 不是 nil,但 _userRoutes.last 是,这就是打印为 nil 的内容。我认为没有任何事情会“返回”,我认为正在发生第二次调用,在这种情况下 _userRoutes 为 nil 并在您尝试调用 _userRoutes.last 时导致崩溃。

打印 _userRoutes 以确认这一点,如果不是,请发布更多代码来显示如何设置 _userRoutes。

【讨论】:

是的,我很抱歉没有让它更清楚,但在运行之前我有一个打印语句(“HERE”)。如果它没有倒退并第二次崩溃,它会在崩溃之前触发“HERE”(它不会)。【参考方案2】:

TLDR

在我的代码中更远的地方有一个变量为零。展开那个变量导致了崩溃。编译器标记了错误的行,这导致了一大堆混乱。

完整诊断请看这里: https://***.com/a/32659053/3324388

【讨论】:

以上是关于EXC_BAD_INSTRUCTION 在 Swift 中为 locationManager 崩溃(经理:CLLocationManager,didUpdateLocations 位置:[CLLoca的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:在展开可选值时意外发现 nil (EXC_BAD_INSTRUCTION)

整数溢出在 Swift 中给出 EXC_BAD_INSTRUCTION

SwiftUI CoreData MVVM 解决错误“EXC_BAD_INSTRUCTION....”

按下按钮时的 EXC_BAD_INSTRUCTION

键盘操作上的 EXC_BAD_INSTRUCTION [重复]

Swift-音频实现崩溃:“EXC_BAD_INSTRUCTION”