CoreText在多个线程中运行时崩溃

Max*_*ann 13 iphone cocoa-touch core-text ios

我的核心文本有一个非常奇怪的问题,它有时会随机地,有时可重复地崩溃我的应用程序.我用它来布局并渲染几页.我在后台异步执行此操作以不阻止用户界面.

虽然这一般工作正常,但它有时会崩溃.所有这些崩溃发生在同一条线上:

framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)myText);
Run Code Online (Sandbox Code Playgroud)

实际上,它们似乎也来自框架中的类似点.我知道你不喜欢它,但这里是崩溃日志的负责人:

Thread 8 Crashed:
0   ???                             0x0764f446 typeinfo for FT::data_stream + 6
1   libCGFreetype.A.dylib           0x076048b8 FT::font::copy_table(unsigned int) const + 94
2   libCGFreetype.A.dylib           0x0760b085 (anonymous namespace)::copy_table(void*, unsigned int) + 53
3   CoreText                        0x00f9592e TBaseFont::CopyTable(unsigned int) const + 334
4   CoreText                        0x00f670f6 TAATMorphTable::TAATMorphTable(TLine&, long, unsigned int) + 110
5   CoreText                        0x00f6744c TAATMorphTableMorx::TAATMorphTableMorx(TLine&, long, TGlyphList<TDeletedGlyphIndex>&) + 54
6   CoreText                        0x00f53eb5 TShapingEngine::ShapeGlyphs(TLine&, TCharStream const&, CFRange&, TGlyphList<TDeletedGlyphIndex>*) + 215
7   CoreText                        0x00f579ce TTypesetter::FinishEncoding(TLine&, signed char, TGlyphList<TDeletedGlyphIndex>*) const + 260
8   CoreText                        0x00f6664b TTypesetterAttrString::Initialize(__CFAttributedString const*) + 543
9   CoreText                        0x00f6683e TTypesetterAttrString::TTypesetterAttrString(__CFAttributedString const*) + 158
10  CoreText                        0x00f6102e TFramesetterAttrString::TFramesetterAttrString(__CFAttributedString const*) + 86
11  CoreText                        0x00f6099e CTFramesetterCreateWithAttributedString + 78
...
Run Code Online (Sandbox Code Playgroud)

我记得的所有崩溃都在FT::font::copy_table函数中.有趣的是,字体要求越复杂,崩溃的频率就越高.中文文本几乎总是崩溃 - 这些字体似乎很复杂.

解决方法:我发现的解决方法是将调用顺序化CTFramesetterCreateWithAttributedString为主队列或单独的队列.问题是这个单一调用占总布局的79%并渲染运行时间.所以我很想拥有多个主题.

问题:任何专业人士可以提供帮助吗?对我来说,这听起来像是一个内心深处的竞争条件.我没有发现任何声明CoreText可能没有使用线程的东西.我明天会提交一个bug.但是,我可能也错过了一些东西.有什么建议?

谢谢,马克斯

Max*_*ann 7

我在WWDC期间询问了一些工程师他们是否知道这个问题.答案:是的.事实上,类型子系统中存在一些问题.他们可能有一天会做一个修复,但是现在剩下要做的就是对所有文本布局进行顺序化.:(

大家:请归档BUGS!