J'essaie de tester l'application sur la version bêta d'iOS 13. Lorsque je tape sur un bouton de mon écran de bienvenue pour accéder à un autre écran, l'application se bloque, puis s'arrête. Lorsque je débogue dans Xcode 11, je vois les lignes d'avertissement suivantes dans la console:
[framework] CoreUI: RunTimeThemeRefForBundleIdentifierAndName () n'a pas pu trouver Assets.car dans le bundle avec l'identifiant: '(null)'
[framework] CoreUI: RunTimeThemeRefForBundleIdentifierAndName () n'a pas pu trouver Assets.car dans le bundle avec l'identifiant: '(null)'
puis après plusieurs secondes, l'application se termine avec une entrée de journal:
Message du débogueur: arrêté en raison d'un problème de mémoire
Sur iOS 12, ce problème n'existe pas. J'ai créé une application de test simple avec plusieurs fichiers d'actifs et l'enchaînement sur le bouton a bien fonctionné. J'ai également changé la version cible pour iOS 13, changé l'identifiant du bundle, nettoyé et reconstruit, mais le problème persiste.
J'ai découvert que le problème n'était pas lié à
CoreUI: RunTimeThemeRefForBundleIdentifierAndName () n'a pas pu trouver Assets.car dans le bundle avec l'identifiant: '(null)'
Sur l'écran cible a été utilisé UILabel personnalisé. La cause première du gel des applications et du problème de mémoire était une boucle réentrante entre ses méthodes
override var text: String? {
didSet {
guard let text = text else { return }
let textRange = NSMakeRange(0, text.count)
// Kern attribute needed to do letter spacing over text
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttribute(NSAttributedStringKey.kern , value: 2.0, range: textRange)
// Add other attributes if needed
self.attributedText = attributedText
}
}
et
override public func layoutSubviews() {
super.layoutSubviews()
if let text = self.text {
self.text = text.uppercased()
}
}
probablement la nouvelle version du SDK invoque layoutSubviews () lorsque le champ attributedText
a changé