首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiThread Crash中的sizeWithFont!

MultiThread Crash中的sizeWithFont!
EN

Stack Overflow用户
提问于 2010-08-20 10:57:07
回答 3查看 2K关注 0票数 3

sizeWithFont在多线程中崩溃,这是调试信息:

代码语言:javascript
复制
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对象都是多行文本时,才会出现这个错误

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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,该规则是宽松的。

票数 4
EN

Stack Overflow用户

发布于 2010-08-20 11:58:38

通过在对象周围放置随机锁来解决多线程问题please.

  • "Solving“
  • Formatting从来都不是正确的答案。永远不会。多线程需要系统地设计你的application.
  • If一个锁确实“修复”了问题,显示你锁了什么以及如何对评估situation.
  • Some的关键更多的症状将是有帮助的。尤其是代码。问题中的代码非常有用。

考虑到缺乏证据,我敢打赌,你在一个线程上改变了一个字符串,同时试图在另一个线程上获取大小。或者对象在一个线程上被释放,同时仍在另一个线程上使用。或者您正在从不是线程安全的辅助线程操作对象。

票数 4
EN

Stack Overflow用户

发布于 2010-09-07 15:40:01

我觉得performSelectorOnMainThread:withObject:waitUntilDone:是对的

在此之前,我使用一个操作来计算文本大小,并在主线程中使用waitUntilAllOperationsAreFinished来等待操作的返回,

但是如果我还在操作中使用了performSelectorOnMainThread:withObject:waitUntilDone,并将waitUntilDone参数设置为Yes(因为我需要结果)

主线程将被截断

因此,现在我删除了waitUntilAllOperationsAreFinished,并使用一个异步对象来确保该操作在前一个操作停止之前不会启动

代码语言:javascript
复制
                    [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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3527877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档