このコードは、CFAttributedStringがスレッドセーフではないことを示していますか?あるいは私はセットアップで何か間違っていますか?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
}
}
}
私は文字列をそのように作成すると、残念ながら私はまだ同じ場所にエラーが表示されています。この場合CFAttributedStringを使用する理由は、コード内の場所が高温で、CFAttributedStringSetAttributeの実行速度が非常に速く、NSMutableAttributedStringで属性を追加するためです。 –
素早いブリッジングがどのように機能するかについて、どこで知ることができるでしょうか?特にパフォーマンスの問題を監視する必要があります。私はSwiftのコアテキストを使用して多くの作業をしており、最適化段階に入っています。ありがとう。 –
ありがとうございました。 NSAttributedStringが安全なものとしてリストされ、Core Foundationがここで「一般的に」安全と宣言されて以来、スレッドセーフであることを期待していました:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.htmlしかし、この場合、あなたの助けをもう一度知り、感謝しています。 –