objective-c - 多线程崩溃中的 sizeWithFont!

标签 objective-c multithreading cocoa-touch crash sizewithfont

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: 方法实现的,该方法在主线程上调用给定的选择器:

http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/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/

相关文章:

ios - 从 completionHandler 返回 NSMutableArray( Objective-C )

ios - 为什么不调用 UITableViewCell cellForRowAt 方法?

iphone - 何时取消订阅 UIView 中的 NSNotification

c - 两个消费者一个生产者的 pthread 同步

objective-c - 检查用户是否在连续的 UISlider 上完成滑动?

ios - iPhone 事件指示器

iphone - 何时使用属性和分配初始化

objective-c - iOS 键盘委托(delegate)回调函数

multithreading - oracle序列上的多线程。线程是否有可能从其他线程获得相同的序列值?

java - TimerTask 停止所有其他执行