gpt4 book ai didi

swift - 在 Swift 中调用 CFDictionaryContainsValue()

转载 作者:行者123 更新时间:2023-11-28 06:50:45 24 4
gpt4 key购买 nike

我有一个 Core Foundation 字典,我想在其中查找特定值。自然地,我会使用 Core Foundation 提供的 CFDictionaryContainsValue()。第一个参数是要搜索的 Core Foundation 字典,第二个参数的类型是 UnsafePointer<Void> .我在字典中寻找一个字符串,所以我尝试了这样的事情:

var deviceToFind = "disk1"
var result: kern_return_t = KERN_FAILURE
let classesToMatch = IOServiceMatching(kIOMediaClass)
let classesToMatchDict = (classesToMatch as NSDictionary) as! Dictionary<String, AnyObject>
let matchedDevices = (classesToMatchDict as NSDictionary) as CFDictionaryRef

result = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatchCFDictRef, &storageIterator);

if CFDictionaryContainsValue(matchedDevices, &deviceToFind) == true
{
print("Found disk1")
}

但这只是在调用 CFDictionaryContainsValue() 时崩溃 (EXC_BAD_ACCESS) .根据Apple's documentation for interacting with UnsafePointers我正在正确构建调用,但显然存在问题,但我不确定如何让它工作。

最佳答案

要从 IOReg 获取 BSD 名称,您不能直接从 matchedDevices 检索值。您必须遍历 storageIterator 并分别获取 BSD name 属性。

var deviceToFind = "disk1"
var storageIterator = io_iterator_t()
var object : io_object_t
var result: kern_return_t = KERN_FAILURE
let classesToMatchDict = IOServiceMatching("IOMedia")

result = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatchDict, &storageIterator)

if KERN_SUCCESS == result && storageIterator != 0 {
repeat {
object = IOIteratorNext(storageIterator)
if let data = IORegistryEntryCreateCFProperty(object, kIOBSDNameKey, kCFAllocatorDefault, 0), disk = data.takeRetainedValue() as? String {
if deviceToFind == disk {
print("Found \(deviceToFind)")
break
}
}
} while object != 0
IOObjectRelease(storageIterator)
}

关于swift - 在 Swift 中调用 CFDictionaryContainsValue(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com