Swift UnsafeMutableRawPointer返回类而不是实例

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

我希望此代码返回一个NSString,其ID为当前所选输入源的ID。相反,它似乎返回了NSString类之一。

import Foundation
import Carbon

let current = TISCopyCurrentKeyboardInputSource().takeUnretainedValue()

let id = TISGetInputSourceProperty(current, kTISPropertyInputSourceID).load(as: NSString.self)
id.length

当我在macOS应用中运行此命令时,我在日志中收到以下错误消息:+[__NSCFConstantString _fastCStringContents:]: unrecognized selector sent to class 0x7fff92cf79e8。如何解决此问题,以便获得正确的返回值?

swift pointers macos-carbon
1个回答
0
投票

TISGetInputSourceProperty()返回一个(非托管的)原始指针,该原始指针必须转换为CFStringRef,而不是已取消引用load()

let current = TISCopyCurrentKeyboardInputSource().takeRetainedValue()
if let ptr = TISGetInputSourceProperty(current, kTISPropertyInputSourceID) {
    let id = Unmanaged<CFString>.fromOpaque(ptr).takeUnretainedValue() as String
    print(id) // com.apple.keylayout.German
}

还请注意,takeRetainedValue()必须用于TISCopyCurrentKeyboardInputSource()的返回值,因为该函数返回一个(+1)保留的引用,否则会出现内存泄漏。

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