用 LET 定义的 Swift 常量有时会在读取时产生 EXC_BAD_ACCESS (EXC_I386_GPFLT) (OSX) 的结果。

问题描述 投票:1回答:2

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

class AppDelegate: NSObject, NSApplicationDelegate {

let busyImage = NSImage(named: "BusyStatus");
...

在另一个类中,我在应用程序运行期间多次访问这个图标。在带固态硬盘的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)
 }

什么原因会导致这种情况,如何避免?

macos swift crash exc-bad-access
2个回答
0
投票

自从swift 2.问题似乎消失了,再也没有出现过这个问题,我的代码完全没有改变。


0
投票

来自互联网的人们,你们好。

我的环境是macOS 10.15.4,运行XCode 11.5 (11E608c)和Swift 5。

我这里的一小段代码也有完全相同的问题,在使用旋转时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()
}

这段代码看起来一点都不奇怪 rotation 是一个浮动的向量,在Class中定义为。

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()
}

现在它就能顺利运行了 这很疯狂,因为我没有看到明显的原因。我没有尝试改变一个常量,甚至连linter都建议我改变这个函数的 varletdeltaX 定义。

我觉得这是Swift的问题,但是对于一个很多人都在使用的第五版语言来说,这是令人担忧的。

如果我找到了解决方案或者至少是一个有效的解释,我会更新我的答案。

长命百岁,小伙子们!

© www.soinside.com 2019 - 2024. All rights reserved.