应用程序在模拟器中卡住了

3

问题

我将我的项目升级到Swift 3.0,但在更新后,应用程序无法在模拟器上运行。它不会崩溃,但只是冻结。

我调查了这个问题,发现应用程序在自定义字体的初始化过程中挂起。

我复制了下面的函数:

func registerMaterialFont() {
    let url = Bundle.main.url(forResource: "Material-Design-Iconic-Font", withExtension: "otf")!
    let data = try! Data(contentsOf: url)

    let provider = CGDataProvider(data: data as CFData)

    print("Test 1")

    let font = CGFont(provider!)

    print("Test 2")

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(font, &error) {
        //Error handling here
    } else {
        log.info("Material Font registered");
    }
}

控制台只会打印出测试1

有人知道发生了什么吗?

NB:此应用程序正在带有sim卡的测试手机上运行,而未在没有sim卡的手机上运行!

编辑:堆栈跟踪 如果我在调试控制台中按下暂停,将显示以下堆栈跟踪:

堆栈跟踪

libsystem_kernel.dylib`semaphore_wait_trap:
    0x10c765fa4 <+0>:  movq   %rcx, %r10
    0x10c765fa7 <+3>:  movl   $0x1000024, %eax          ; imm = 0x1000024 
    0x10c765fac <+8>:  syscall 
->  0x10c765fae <+10>: retq   
    0x10c765faf <+11>: nop    

2
通过调试器运行应用程序。当它卡住时,在调试器中单击暂停按钮,并查看生成的堆栈跟踪,以查看它卡在哪里。 - rmaddy
你好奇为什么要使用这么多代码来加载字体?为什么不按照正常的方式注册otf文件以添加自定义字体呢?请参考https://dev59.com/1HRC5IYBdhLWcg3wP-n5。 - rmaddy
1
你看到你链接的 rdar 中的注释了吗?“在绘制 PDF 之前调用 [UIFont systemFontOfSize:12]; 可以解决问题。”试试自己操作。在你的 registerMaterialFont 方法开始处访问 UIFont - rmaddy
@rmaddy:谢谢!_ = UIFont() - Bas
1
不要将其作为问题更新发布,而是发布一个正确的答案。 - rmaddy
显示剩余4条评论
1个回答

9
这是IOS/Swift中的一个bug。(更多信息请见:http://www.openradar.me/18778790)
调用:
_ = UIFont() 

之前

CGFontCreate()

防止函数发生死锁。


在链接中建议的调用[UIFont systemFontOfSize:12];对我起作用了。 - Adamski
有没有想过这是什么原因?我尝试创建let fontRef = CGFont(fontProviderRef)时出现了同样的问题,然后应用程序崩溃了。当我添加let _ = UIFont()时,问题得到了解决并且不再发生崩溃,但我不知道为什么? - KarimIhab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接