- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我调用了一些返回 CFStringRef
值的 CFArray
的函数。我需要从他们那里得到 utf 字符串。因为我不想让我的代码太复杂,所以我做了以下事情:
let initString = "\(TISCreateInputSourceList(nil, false).takeUnretainedValue())"
然后我将生成的字符串拆分为 \n
以获取 Swift 字符串数组。然而,当函数开始返回非 ascii 字符串时,麻烦就开始了。我开始收到像“\U2345\U2344”这样的字符串。
然后我尝试获取 CFArray 并对其进行迭代以获取值并可能将它们转换为字符串,但我无法从中获取值:
let ar = TISCreateInputSourceList(nil, true).takeUnretainedValue()
for i in 0...CFArrayGetCount(ar) - 1 {
print(">> ( CFArrayGetValueAtIndex(ar, i).memory )")
}
值始终为空。
如何获取实际值?
最佳答案
这里有一些问题。一、TISCreateInputSourceList()
名称中有“Create”,这意味着它返回一个 (+1) 保留对象,你必须用 takeRetainedValue()
取值,不是 takeUnretainedValue()
,否则代码会泄漏内存:
let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue()
您现在可以使用 CFArray...
从数组中获取值的方法,但将其转换为 NSArray
更容易(这是“免费桥接”):
let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue() as NSArray
这不是 CFStringRef
的数组值,而是一个数组 TISInputSource
对象。您可以转换 NSArray
到 Swift 数组:
let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue()
as NSArray as! [TISInputSource]
强制施法as!
在这里是可以接受的,因为函数是已记录以返回一组输入源。
现在您可以简单地遍历数组的元素:
for src in srcs {
// do something with `src` (which is a `TISInputSource`)
}
使用 TISGetInputSourceProperty()
检索输入源的属性功能,例如:
let ptr = TISGetInputSourceProperty(src, kTISPropertyInputSourceID)
这将返回一个必须转换为对象的“空指针”(UnsafeMutablePointer<Void>
)适当类型的指针(对于 CFStringRef
属性(property))。不幸的是,这有点复杂(比较 How to cast self to UnsafeMutablePointer<Void> type in swift ):
let val = Unmanaged<CFString>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()
我们可以再次利用免费桥接,现在从 kTISPropertyInputSourceID
至 CFStringRef
和 NSString
:
let val = Unmanaged<CFString>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()
as String
综合起来:
let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue()
as NSArray as! [TISInputSource]
for src in srcs {
let ptr = TISGetInputSourceProperty(src, kTISPropertyInputSourceID)
let val = Unmanaged<CFString>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()
as String
print(val)
}
关于string - Swift:CFArray:获取值作为 UTF 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34120142/
这可能是一个重复的问题,但我已经浏览了这么多博客和文档,但我仍然无法弄清楚什么是 CFArray。 作为性能方面的最佳选择,何时使用以及在何种情况下使用。请阐明这个主题。 最佳答案 A CFArray
我正在尝试从地址簿中获取联系人。我的代码在 Objective C 中运行正常,但是当我将其转换为 swift 时,出现错误 无法将“Swift.UnsafePointer”类型的值转换为“Swift
在测试我的应用程序是否存在内存泄漏时,我发现每当我以间隔启动 NSTimer 时,它都会显示 CFArray(store-deque)和 CFArray(可变变量)的大小不断增加。在我的实际应用程序中
几个月来我一直在使用这段代码来查找某个事件应用程序的窗口 ID: let info = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowL
我使用 ARC 制作了一个 iPhone 应用程序,可以访问地址簿中的每个条目,然后访问每个人的每个地址。数据存储在 CFArray 中,CFArray 可以免费桥接到 NSArray。代码如下。 A
我在使用Core Foundation Array时发现了一个奇怪的问题!这是代码片段 fname = CFStringCreateWithFormat(kCFAllocatorDefault, NU
使用 Swift,我试图循环遍历 CFURL 的 CFArray,但出现了 EXC_BAD_INSTRUCTION 错误。 let apps = LSCopyApplicationURLsForURL
如何调用以下函数: func AXUIElementCopyAttributeNames(element: AXUIElement!, names: UnsafePointer?>) -> AXErr
我正在寻找一种更简单的方法来操作 iPhone 上的音频缓冲区。主要是我试图避免 C 的指针问题和数组计数问题,但不想被我必须与 NSArray 一起使用的数字对象(如 NSNumber 或 NSIn
unsigned char _MyString[] = {0xda, 0xe5, 0x18, ..., 0x00}; CFArrayRef array = CFArrayCreate(NULL,
为了测试,我复制了以下示例代码 [ https://developer.apple.com/library/ios/documentation/CoreFoundation/Conceptual/CF
我正在尝试将从 iPhone 的摄像机接收到的 150 CMSampleBufferRef 收集到数组中。 相机在 13 个缓冲区后以某种方式停止调用委托(delegate)。 我尝试使用 NSMut
我正在尝试使用 Swift 在 Mac OS X 应用程序中捕获窗口列表。 CGWindowListCreateImageFromArray 函数需要一个 CFArray。我已经尝试了几件事,这是我所
我调用了一些返回 CFStringRef 值的 CFArray 的函数。我需要从他们那里得到 utf 字符串。因为我不想让我的代码太复杂,所以我做了以下事情: let initString = "\(
根据 Apple 的“将 Swift 与 Cocoa 和 Objective-C 结合使用”,“在 Swift 中,您可以互换使用每一对免费桥接基础和核心基础类型”。这使得使用 Core Founda
我以前没有使用过 Zombies,并且必须承认我不确定它在做什么。但是,我担心一件事: CFArray 似乎在不断增加它的 Live Bytes 和 # Living 列,以及一些我认为是相关的 ma
实现将原始数字的 C 数组包装到 CFNumbers 的 CFArray 中的方法的最佳方法是什么? 我想这样调用: double values[] = {1.2345, 678.9}; CFArra
部署目标是10.6,因此需要手动内存管理。该集合应该负责保留/释放 GCD 对象。 我相信 CFDictionary 的 CFArray 的自定义回调会有所帮助,但是我正在寻找一个简单的、经过充分测试
这在 Xcode 8 beta 6 中不再有效: let colors:CFArray = [fromColor.cgColor, toColor.cgColor] 或 let gradient:CG
我是一名优秀的程序员,十分优秀!