Ios 应用程序挂起在模拟器中
问题 我将我的项目升级到Swift 3.0,但升级后,该应用程序将无法在模拟器上运行。它没有崩溃,只是冻结了 我调查了这个问题,发现应用程序挂在自定义字体的初始化上 我复制了下面的函数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
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()