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对象的代码都在主线程上执行。这是通过使用permareSelectorOnmainthread:whiteObject:waituntildone:方法来实现的,该方法在主线程上调用给定的选择器:

:

或单触摸:foo.invokeonmainthread(委托{your_code_here});

1]使用iOS 4.0,该规则放宽了少数API。

其他提示

  • 请格式化。

  • 通过在对象周围放置随机锁来“解决”多线程问题,绝不是正确的答案。永远不会。多线程需要您的应用程序系统设计。

  • 如果锁确实“解决”了问题,则显示您锁定的内容以及如何评估情况至关重要。

  • 更多症状将有所帮助。尤其是代码。您的问题中的代码非常有用。

鉴于缺乏证据,我敢打赌,您在试图抓住另一个线程的同时在一个线程上突变一根弦。否则该对象仍在一个线程上释放,同时仍然使用另一个线程。或者,您正在从辅助线程中操纵一个不安全的对象。

我认为permorySelectorOnMainThread:withObject:waituntildone:正确,

以前,我使用操作计算文本大小,并使用主线程中的Waituntilallallallallaseration ArareArareArareArareFiin the Mainther for Operation返回,
但是,如果我还使用permareSlectorOnmainthread:whiteObject:waituntildone在操作中,并将waituntildone参数设置为YES(因为我需要结果)
主线程将被卡住

因此,现在我删除了waituntilallallallallaterationarefined,并使用异步对象确保操作直到上一个停止之前才能启动

                    [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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top