Objective c 多线程崩溃中的sizeWithFont!

Objective c 多线程崩溃中的sizeWithFont!,objective-c,multithreading,cocoa-touch,crash,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 i

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(委托{your_code_here})


    [1] 在iOS 4.0中,一些API的规则是宽松的。

    我认为performSelectorOnMainThread:withObject:waitUntilDone:是正确的

    之前,我使用一个运算来计算文本大小, 并使用主线程中定义的WaitUntillalOperations等待操作返回,
    但是如果我在操作中也使用performselectornmainthread:withObject:waitUntilDone,并将waitUntilDone参数设置为Yes(因为我需要结果)
    主螺纹将被卡住

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

                        [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;
    

    当然,我编辑了标签,但你真的需要更连贯地解释才能让任何人回答。这些护目镜对这个问题没有任何作用!啊,我的眼睛!!!!他们燃烧!!!我不知道Cocoa对象,堆栈中引用的ICU对象肯定不会以这种方式从多个线程中使用。另一个答案似乎也支持这一点。我想你需要弄清楚如何不同时从两个线程调用这个对象。包括MonoTouch版本对我很有帮助,谢谢。