Вопрос

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, выполняется в главной ните. Это достигается с помощью PerformeselectionOnmaintHeaintHead: withobject: waituntildone: метод, который вызывает данный селектор на главном потоке:

http://developer.apple.com/iphone/Library/documentation/cocoa /reference/foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/nsobject/performselectoronmaintHeaindelection:

Или в monotouch: foo.invokeonmainthrad (делегат {your_code_here});

1] С IOS 4.0 правило расслаблено для горстки API.

Другие советы

  • Форматирование, пожалуйста.

  • «Решение» проблема с несколькими резьбой путем размещения случайных замков вокруг объектов, никогда не является правильным ответом. Никогда не. Многопоточная потребность требует системной конструкции вашего приложения.

  • Если замок «исправить» проблема, показывая то, что вы заблокировали и как важно оценить ситуацию.

  • Некоторые более симптомы будут полезны. Код, в частности. Код в ваших вопросах очень полезен.

Учитывая отсутствие доказательств, я ставлю, что вы мутируете строку на одном потоке, пытаясь схватить размер на другой. Или объект выпускается на одном потоке, пока все еще используя его другой. Или вы манипулируете объектом из вторичной нити, который не безопасен в потоке.

Я думаю, что PerformSelectorOnmaintHaintHead: withobject: waituntildone: правильный,

Раньше я использую операцию для расчета размера текста и использовать waituntilalloPerationsarefined в основной нити, чтобы дождаться возврата операции,
Но если я также использую PerformSelectiononMaintHeaintHead: with outsject: waituntildone в операции, и установить параметр wientuntildone на да (потому что мне нужен результат)
Основная тема будет застряла

Итак, теперь я удаляю WaituntilalloPerationsarefined, и использую асинхронный объект, чтобы гарантировать, что операция не запускается, пока предыдущий не остановился

                    [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