Macos 使用LET定义的Swift常量有时会在读取(OSX)时生成EXC_BAD_访问(EXC_I386_GPFLT)
在我的AppDelegate中,我有一个用于状态栏图标的常量,在应用程序繁忙时使用:Macos 使用LET定义的Swift常量有时会在读取(OSX)时生成EXC_BAD_访问(EXC_I386_GPFLT),macos,swift,crash,exc-bad-access,Macos,Swift,Crash,Exc Bad Access,在我的AppDelegate中,我有一个用于状态栏图标的常量,在应用程序繁忙时使用: class AppDelegate: NSObject, NSApplicationDelegate { let busyImage = NSImage(named: "BusyStatus"); ... 在另一个类中,在应用程序运行期间,我会多次访问它。在装有SSD的Macbook Air电脑上,我有时会收到 EXC_BAD_ACCESS (SIGSEGV) Exception Codes:
class AppDelegate: NSObject, NSApplicationDelegate {
let busyImage = NSImage(named: "BusyStatus");
...
在另一个类中,在应用程序运行期间,我会多次访问它。在装有SSD的Macbook Air电脑上,我有时会收到
EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: EXC_I386_GPFLT
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libswiftCore.dylib 0x0000000103876cf9 swift_unknownRetain + 41
1 de.test.myapp 0x000000010304743b TestApp.AppDelegate.busyImage.getter : ObjectiveC.NSImage? (in TestApp) (AppDelegate.swift:0)
2 de.test.myapp 0x0000000102f9aa77 TestApp.Sync.(update (TestApp.Sync) -> () -> ()).(closure #2) (in TestApp) (Sync.swift:271)
那里的代码是:
statusBarItem!.image = appDelegate!.busyImage
它位于一个称为主线程的块中:
let updateBlock: () -> () = {
appDelegate!.statusBarItem!.image = self.appDelegate!.busyImage
[... other code ...]
}
if NSThread.isMainThread()
{
updateBlock()
}
else
{
dispatch_sync(dispatch_get_main_queue(),updateBlock)
}
什么会导致这种情况以及如何避免这种情况?问题似乎从swift 2开始就消失了。
我再也没有遇到过这个问题,我的代码也没有任何变化。大家好,来自互联网的人们 我的env是macOS 10.15.4,我正在使用Swift 5运行XCode 11.5 11E608c 我也有同样的问题,这里有一段代码在使用旋转时100%失败:
override func rotate(delta: float2) {
let sensitivity: Float = 0.005
rotation.y += delta.x * sensitivity // FAILS with Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
_viewMatrix = updateViewMatrix()
}
这段代码看起来一点也不奇怪。旋转是类中定义的浮点向量,如下所示:
var rotation: float3 = [0, 0, 0]
现在,我花了一些时间尝试同一函数的多个版本,如果我将其重写为:
override func rotate(delta: float2) {
let sensitivity: Float = 0.005
var deltaX: Float = delta.x * sensitivity
rotation.y += deltaX
_viewMatrix = updateViewMatrix()
}
它现在运行平稳。这太疯狂了,因为我看不出明显的原因。我不试图改变一个常数,甚至林特建议我改变var,以允许deltaX定义
我觉得这是一个迅速的问题,但对于许多人使用的第五种语言来说,这是一个令人担忧的问题
如果我找到一个解决方案或至少是一个有效的解释,我会更新我的答案
小伙子们,长命百岁 在你做任何其他事情之前,你应该先测试一下你的未包装的选项是否与那些带有!在你帮助他们或帮助他们之前真的存在。是的,我知道。它们是上面几行的睾丸。如果appDelegate Order statusBarItem为nil,则不会进入此块。-在我看来,NSImage类get的getter是nil,它不应该得到任何。似乎,我只是在AppDelegate中实现了一个方法来设置属性,从上面的块中调用,从而消除了这个错误。。。我保留这个问题,也许有人可以回答为什么这不起作用。所以问题似乎是块在AppDelegate中设置了属性?当块调用AppDelegate中的一个方法来设置属性时,它会工作吗?通常这两种方法都会工作,但直接设置属性有时会出现此错误。调用该方法没有。。。然而