enumerateAttributesInRange
方法获取一个代码块并为 NSAttributedString
中的每个属性执行它
当以下方法在我的应用程序被卡住后很快被连续调用两次时,我想知道这是因为 enumerateAttributesInRange 异步运行代码块,所以 2 个线程试图同时修改我的 AttributedString。
- (void) doSomething
{
//following line works fine
[self doSomethingwithAttributedString];
//following line works fine
[self doSomethingwithAttributedString];
[self performSelector:@selector(doSomethingwithAttributedString) withObject:nil afterDelay:1];
//following crashes
[self doSomethingwithAttributedString];
[self doSomethingwithAttributedString];
}
- (void)doSomethingwithAttributedString
{
[self.attributedString enumerateAttributesInRange:_selectedRange options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:
^(NSDictionary *attributes, NSRange range, BOOL *stop) {
// Here I modify the dictionary and add it back to my attributedString
}];
}
最佳答案
您正在枚举属性字符串时对其进行修改。我敢打赌这会彻底混淆枚举器,因为它正在处理的属性字符串不在它开始枚举时的状态。在块中,只收集属性,例如在字典或数组中,但修改它们并在之后将它们应用于字符串,即在枚举完成之后。
换句话说:不要将修改属性字符串的代码放在枚举期间调用的块中。 docs 说你可以在块应用的范围内修改属性字符串,但是ISTM你必须非常小心不要到外面去。我不会这样做。
关于iphone - NSAttributedString - enumerateAttributesInRange 导致崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6797311/