在我的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)
}
什么原因会导致这种情况,如何避免?
自从swift 2.问题似乎消失了,再也没有出现过这个问题,我的代码完全没有改变。
来自互联网的人们,你们好。
我的环境是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都建议我改变这个函数的 var
到 let
在 deltaX
定义。
我觉得这是Swift的问题,但是对于一个很多人都在使用的第五版语言来说,这是令人担忧的。
如果我找到了解决方案或者至少是一个有效的解释,我会更新我的答案。
长命百岁,小伙子们!