gpt4 book ai didi

调用 stopDeviceMotionUpdates() 后抛出 iOS CoreMotion.MotionThread EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-05 03:49:31 37 4
gpt4 key购买 nike

我有一个 View Controller ,它使用 CoreMotion 来监控设备的 Attitude。

这是调用 startDeviceMotionUpdates() 时使用的处理程序:

/**
* Receives device motion updates from Core Motion and uses the attitude of the device to update
* the position of the attitude tracker inside the bubble level view.
*/
private func handleAttitude(deviceMotion: CMDeviceMotion?, error: Error?) {
guard let attitude = deviceMotion?.attitude else {
GLog.Error(message: "Could not get device attitude.")
return
}

// Calculate the current attitude vector
let roll = attitude.roll
let pitch = attitude.pitch - optimalAngle
let magnitude = sqrt(roll * roll + pitch * pitch)

// Drawing can only happen on the main thread
DispatchQueue.main.async {
[weak self] in

guard let weakSelf = self else {
GLog.Log("could not get weak self")
return
}
// Move the bubble in the attitude tracker to match the current attitude
weakSelf.bubblePosX.constant = CGFloat(roll * weakSelf.attitudeScalar)
weakSelf.bubblePosY.constant = CGFloat(pitch * weakSelf.attitudeScalar)

// Set the border color based on the current attitude.
if magnitude < weakSelf.yellowThreshold {
weakSelf.attitudeView.layer.borderColor = weakSelf.green.cgColor
} else if magnitude < weakSelf.redThreshold {
weakSelf.attitudeView.layer.borderColor = weakSelf.yellow.cgColor
} else {
weakSelf.attitudeView.layer.borderColor = weakSelf.red.cgColor
}

// Do the actual drawing
weakSelf.view.layoutIfNeeded()
}
}

我添加了 [weak self] 看它是否能解决问题,但它没有。此崩溃不容易重现。

当我完成使用 CoreMotion 的 VC 时,我在 VC 的 viewWillDisappear() 方法中调用 stopDeviceMotionUpdates() 。此 VC 是应用程序中唯一导入 CoreMotion 的类。

但是,当我到达下一个 VC 时,偶尔会看到 EXC_BAD_ACCESS 被抛出到一个 com.apple.CoreMotion.MotionThread 上。

MotionThread backtrace

有人知道为什么 CoreMotion 会在使用它的 VC 被关闭后生成一个线程吗?当崩溃发生时,我已经验证了 VC 不再在内存中。是的,我正在处理的两个 VC 是模态呈现的。

我检查了内存图,当崩溃发生时,会报告这些 CoreMotion 对象:

enter image description here

和:

enter image description here

我不知道在 CoreMotionManager 的实例被释放后这些对象是否应该仍然在内存中。根据内存图,内存中没有CoreMotionManager的实例。

导入CoreMotion的VC也导入了ARKit。不确定 CoreMotion 和 ARKit 之间的某些疯狂交互是否是问题所在。

在主线程和 MotionThread(14) 之间似乎确实发生了一些事情:

expanded stack trace

我不确定如何处理主线程堆栈跟踪。

有时,当 CoreMotion VC 被关闭时,我注意到它使用的内存在释放时存在延迟。发布总是最终发生。

感谢任何能提供帮助的人!

最佳答案

我们有一个 ARSCNView 成员。当我们关闭使用 sceneView 成员的 VC 时,我们没有调用 sceneView.session.pause() 。一行代码。就是这样。

关于调用 stopDeviceMotionUpdates() 后抛出 iOS CoreMotion.MotionThread EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63946685/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com