Swift:AXUIElementCopyAttributeValue返回kAXErrorSuccess,但得到了nil指针

时间:2014-12-24 02:23:25

标签: cocoa swift osx-yosemite

请原谅我的英语不好!我正在尝试在Mac OS X中获得专注的应用程序。在XCode 6.1.1中运行时,下面的代码运行正常:

func getFocusedApp() -> AXUIElementRef? {
    let systemWideElement : AXUIElement = AXUIElementCreateSystemWide().takeRetainedValue()
    let kAXFocusedApplication : CFString! = "AXFocusedApplication"
    var focusedElementPtr : Unmanaged<AnyObject>?
    var error : AXError = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedApplication, &focusedElementPtr)
    if let ue = focusedElementPtr {
        return ue.takeUnretainedValue() as AXUIElementRef
    }
    else {
        printError(error)
    }
    return nil
}

其中 printError 显然是打印错误的函数。但是,当我将应用程序存档到Yosemite的Applications文件夹中时, focusedElementPtr 始终为nil,而 error == AXError(kAXErrorSuccess)(启用辅助功能,它会传递 AXIsProcessTrustedWithOptions 测试)。我无法弄清楚出了什么问题。如果有人可以帮助我,那就太好了。

提前致谢!

更新:我猜测它与内存管理有关,因此我将代码更改为:

func getFocusedApp() -> AXUIElementRef? {
    var output: AXUIElementRef? = nil
    let systemWideElement : AXUIElement = AXUIElementCreateSystemWide().takeRetainedValue()
    let kAXFocusedApplication : CFString! = "AXFocusedApplication"
    var focusedElementPtr : UnsafeMutablePointer<Unmanaged<AnyObject>?> = UnsafeMutablePointer<Unmanaged<AnyObject>?>.alloc(1)
    var error : AXError = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedApplication, focusedElementPtr)
    if let ue = focusedElementPtr.memory {
        output = ue.takeUnretainedValue() as AXUIElementRef
    }
    else {
        printError(error)
    }
    focusedElementPtr.dealloc(1)
    return output
}

它可能不是最好的解决方案,但现在应用程序按预期运行:)如果我浪费了某人的时间,我很抱歉!

0 个答案:

没有答案