- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这段代码是否表明 CFAttributedString 不是线程安全的?还是我在设置中做错了什么?
我认为 CFAttributedString 可以安全地从多个线程读取,但我发现这段代码每隔几次运行就会崩溃。
@IBAction func testIt(_ sender: Any?) {
let testString = "Hello world! Lets make this a bit longerrrrrrrrrrrrrrrr." as CFString
let testStringLength = CFStringGetLength(testString)
let testAttributedString = CFAttributedStringCreateMutable(kCFAllocatorDefault, testStringLength)
CFAttributedStringReplaceString(testAttributedString, CFRange(location: 0, length: 0), testString)
CFAttributedStringEndEditing(testAttributedString)
for i in 0..<testStringLength {
let range = CFRange(location: i, length: 1)
let keyAndValue = "\(i)" as CFString
CFAttributedStringSetAttribute(testAttributedString, range, keyAndValue, keyAndValue)
}
let immutableTestAttributedString = CFAttributedStringCreateCopy(kCFAllocatorDefault, testAttributedString)
DispatchQueue.concurrentPerform(iterations: 100) { _ in
var index: CFIndex = 0
var effectiveRange: CFRange = CFRange(location: 0, length: 0)
while index < testStringLength {
// Crash happens here EXC_BAD_ACCESS (code=1, address=0x24)
let _ = CFAttributedStringGetAttributes(immutableTestAttributedString, index, &effectiveRange)
index = effectiveRange.location + effectiveRange.length
}
}
}
最佳答案
let testString = "Hello world! Lets make this a bit longerrrrrrrrrrrrrrrr." as CFString
这是一个伪装成 CFString
的 Swift 字符串,它大约有两层间接寻址,并在内部调用了一个非常不同的代码路径(它是否仍然有效取决于你和一个 radar )。
尝试创建一个合适的 CFString
并查看它是否按您预期的方式工作。
var bytes = Array("Hello world! Lets make this a bit longerrrrrrrrrrrrrrrr.".utf16)
let testString = CFStringCreateWithCharacters(nil, &bytes, bytes.count)
(当然,我强烈建议在 NSAttributedString
而不是 CFAttributedString
中完成所有这些工作。与 Swift 相比,Swift->Foundation 桥接要简单得多并且经常使用->Foundation->CoreFoundation 桥接。这可能只是那个桥接中的一个错误,但如果你避免它,你的世界仍然会容易得多。)
虽然我无法使用纯 CFString 重现问题,但这绝对不是线程安全的。 CoreFoundation 是开源的(有点……,但足以满足此目的),因此您可以自己查看代码。最终 CFAttributedStringGetAttributes
调用了 blockForLocation
,它更新内部缓存并且没有锁定它。我没有在文档中看到任何 promise 这是线程安全的内容。
关于swift - CFAttributedString 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696901/
我知道在 CFAttributedString 中不响应任何方法,例如 NSString 的 stringByReplacingOccurrencesOfString:withString: 方法,而
这段代码是否表明 CFAttributedString 不是线程安全的?还是我在设置中做错了什么? 我认为 CFAttributedString 可以安全地从多个线程读取,但我发现这段代码每隔几次运行
我真的被这个问题困扰了。我主要使用 apple docs 中的代码而且效果很好。现在我正在尝试更改 1 个部分,但我不断收到错误!! CFAttributedStringRef currentText
我创建了一个简单的 CFAttributedString,字体为 Futura-Bold,大小为 100px: let font = NSFont(name: "Futura-Bold", size:
我的代码将 CFAttributedString 绘制到图形上下文中,在更新到 Xcode 6.3 之前可以正常工作。 现在,升级后,我收到以下错误: '_' is not convertible t
我是一名优秀的程序员,十分优秀!