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对象都是多行文本时,才会出现这个错误
发布于 2010-08-20 12:10:50
通常,您不应该从单独的线程调用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
或者在委托中: foo.InvokeOnMainThread (MonoTouch{ your_code_here });
1在iOS 4.0中,对于少数几个API,该规则是宽松的。
发布于 2010-08-20 11:58:38
通过在对象周围放置随机锁来解决多线程问题please.
考虑到缺乏证据,我敢打赌,你在一个线程上改变了一个字符串,同时试图在另一个线程上获取大小。或者对象在一个线程上被释放,同时仍在另一个线程上使用。或者您正在从不是线程安全的辅助线程操作对象。
发布于 2010-09-07 15:40:01
我觉得performSelectorOnMainThread:withObject:waitUntilDone:是对的
在此之前,我使用一个操作来计算文本大小,并在主线程中使用waitUntilAllOperationsAreFinished来等待操作的返回,
但是如果我还在操作中使用了performSelectorOnMainThread:withObject:waitUntilDone,并将waitUntilDone参数设置为Yes(因为我需要结果)
主线程将被截断
因此,现在我删除了waitUntilAllOperationsAreFinished,并使用一个异步对象来确保该操作在前一个操作停止之前不会启动
[md removeAllObjects];
[md setObject:subString forKey:@"text"];
[md setObject:[NSNumber numberWithInt:view_w ] forKey:@"width"];
[md setObject:[NSNumber numberWithInt:height_left + font_h ] forKey:@"height"];
[self performSelectorOnMainThread:
@selector(calculateTextRegion:)
withObject:md
waitUntilDone:YES];
CGSize stringSize = textRegion;https://stackoverflow.com/questions/3527877
复制相似问题