Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用LET定义的Swift常量有时会在读取(OSX)时生成EXC_BAD_访问(EXC_I386_GPFLT)_Macos_Swift_Crash_Exc Bad Access - Fatal编程技术网

Macos 使用LET定义的Swift常量有时会在读取(OSX)时生成EXC_BAD_访问(EXC_I386_GPFLT)

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:

在我的AppDelegate中,我有一个用于状态栏图标的常量,在应用程序繁忙时使用:

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中的一个方法来设置属性时,它会工作吗?通常这两种方法都会工作,但直接设置属性有时会出现此错误。调用该方法没有。。。然而