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....”