EXC_BAD_INSTRUCTION 在 Swift 中崩溃 For locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

EXC_BAD_INSTRUCTION Crash In Swift For locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

我正在研究 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。

更新

更明确地检查用户路由是否为 nil(它崩溃了),正如你所看到的,它只打印了一次 "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 was compiled with optimization - stepping may behave oddly; variables may not be available.

我认为您感到困惑,因为您收到了多个 locationManager:manager:didUpdateLocations 的电话。第一次调用 _userRoutes 不是 nil,但 _userRoutes.last 是,这就是打印为 nil 的内容。我不认为 "going back" 有任何问题,我认为正在进行第二次调用,在这种情况下 _userRoutes 为 nil 并在您尝试调用 _userRoutes.last.

时导致崩溃

打印 _userRoutes 以确认这一点,如果没有,请post更多代码来说明如何设置 _userRoutes。

TLDR

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

完整诊断请看这里: