sizeWithFont 在多线程中崩溃,这是调试信息:
1 0x00a0df8e in icu::RuleBasedBreakIterator::handleNext
2 0x00a0daff in icu::RuleBasedBreakIterator::next
3 0x00a0d174 in icu::RuleBasedBreakIterator::following
4 0x35879719 in WebCore::nextBreakablePosition
5 0x3587842a in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:measureOnly:]
6 0x35877da3 in -[NSString(WebStringDrawing) _web_sizeInRect:withFont:ellipsis:lineSpacing:]
7 0x3090d238 in -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:lineSpacing:]
8 0x3090cee3 in -[NSString(UIStringDrawing) sizeWithFont:constrainedToSize:lineBreakMode:]
现在我通过使用NSLock对象来解决错误,在使用这个函数之前我会锁定这个对象,然后解锁
但我认为一定有更好的解决办法!
而且我发现只有当两个线程上这个函数的NSString对象都是多行文本时才会出现这个错误
最佳答案
通常,您不应从单独的线程中调用 UIKit 方法 [1]。是否要锁并不重要,这是不可能的。
当您使用多线程应用程序时,您需要确保接触任何 UIKit 对象的任何代码都在主线程上执行。这是通过使用 performSelectorOnMainThread:withObject:waitUntilDone: 方法实现的,该方法在主线程上调用给定的选择器:
或者在 MonoTouch 中:foo.InvokeOnMainThread (delegate { your_code_here });
[1] 在 iOS 4.0 中,一些 API 的规则放宽了。
关于objective-c - 多线程崩溃中的 sizeWithFont!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3527877/