2016-10-25 21 views
3

ВопросApp висит в тренажере

Я модернизировал свой проект 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"); 
    } 
} 

Консоль будет печатать только Test 1.

Есть ли у кого-то идея, что происходит?

NB :. Это приложение работает на тестовом телефоне с SIM-картой, а не работает по телефону без SIM-карты!

Edit: Stack след Если я нажимаю Pauze в консоли отладки отображается следующий трассировки стека:

Stack Trace

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  
+1

Запустите приложение через отладчик. Когда он застрянет, нажмите кнопку «Пауза» в отладчике и посмотрите на полученную трассировку стека, чтобы увидеть, где она застряла. – rmaddy

+0

@rmaddy Я обновил трассировку стека к комментарию. – Bas

+0

Похож на неприятную ошибку в 'CGFontCreate'. Он использует 'dispatch_once', который, в свою очередь, вызывает' CGFontCreate'. Второй вызов теперь заблокирован, ожидая завершения предыдущего вызова. – rmaddy

ответ

7

Это ошибка в IOS/Swift. (См для получения дополнительной информации: http://www.openradar.me/18778790)

Вызова

_ = UIFont() 

перед тем

CGFontCreate() 

помешают функции от запирания.

+0

Вызов '[UIFont systemFontOfSize: 12];' как было предложено в ссылке, работал для меня. – Adamski

+0

Любая идея, в чем причина этого? У меня была такая же проблема, пытаясь создать let fontRef = CGFont (fontProviderRef) и сбой приложений. Когда я добавил let _ = UIFont() Это исправлено, и авария не произойдет, но я понятия не имею, почему? – KarimIhab

 Смежные вопросы

  • Нет связанных вопросов^_^