Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 应用程序挂起在模拟器中_Ios_Swift_Swift3_Freeze - Fatal编程技术网

Ios 应用程序挂起在模拟器中

Ios 应用程序挂起在模拟器中,ios,swift,swift3,freeze,Ios,Swift,Swift3,Freeze,问题 我将我的项目升级到Swift 3.0,但升级后,该应用程序将无法在模拟器上运行。它没有崩溃,只是冻结了 我调查了这个问题,发现应用程序挂在自定义字体的初始化上 我复制了下面的函数 func registerMaterialFont() { let url = Bundle.main.url(forResource: "Material-Design-Iconic-Font", withExtension: "otf")! let data = try! Data(conte

问题

我将我的项目升级到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");
    }
}
func registerMaterialFont(){
让url=Bundle.main.url(forResource:“材质设计图标字体”,扩展名为“otf”)!
let data=try!data(contentsOf:url)
let provider=CGDataProvider(数据:数据为CFData)
打印(“测试1”)
让font=CGFont(提供程序!)
打印(“测试2”)
var错误:非托管?
if!CTFontManagerRegisterGraphicsFont(字体,&错误){
//这里的错误处理
}否则{
日志信息(“材料字体注册”);
}
}
控制台将仅打印测试1

有人知道发生了什么事吗

注意:。此应用程序正在使用sim卡的测试手机上运行,而未在没有sim卡的手机上运行

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

libsystem\u kernel.dylib`semaphore\u wait\u陷阱:
0x10c765fa4:movq%rcx,%r10
0x10c765fa7:movl$0x1000024,%eax;imm=0x1000024
0x10c765fac:系统调用
->0x10c765fae:retq
0x10c765faf:nop

这是IOS/Swift中的一个错误。(有关更多信息,请参阅:)

召唤

_ = UIFont() 
以前

CGFontCreate()

将防止函数死锁。

通过调试器运行应用程序。当它被卡住时,单击调试器中的“暂停”按钮并查看生成的堆栈跟踪,以查看它被卡住的位置。@rmaddy我将堆栈跟踪更新为注释。看起来像是
CGFontCreate
中的一个讨厌的错误。它使用
dispatch\u once
,然后调用
CGFontCreate
。第二个呼叫现在被阻止,等待上一个呼叫结束。请参阅您链接的rdar中的注释?“在绘制PDF之前调用[UIFont systemFontOfSize:12];可以解决此问题。”。你自己试试吧。在
registerMaterialFont
方法的开头访问
UIFont
。不要将其作为问题的更新发布,而是发布正确的答案。调用
[UIFont systemFontOfSize:12]链接中的建议对我有效。你知道这是什么原因吗??我在尝试创建let fontRef=CGFont(fontProviderRef)时遇到了同样的问题,应用程序崩溃。当我添加let=UIFont()时,它已经修复,崩溃没有发生,但我不知道为什么?
CGFontCreate()