Xcode EXC_BREAKPOINT (code=1, sous-code=...) lors de l'impression url
J'ai un bug étrange dans mon propre programme. Je suis actuellement en train de travailler sur le Montage Vidéo de l'app. J'ai un SongPicker-vue-contrôleur, qui affiche toutes les chansons de l'utilisateur de l'application musique. Lorsque l'utilisateur sélectionne une chanson, d'un nouvel objet (MediaAsset) représentant la chanson est créée. Il a parfaitement fonctionné très bien, quand SongPicker a été écrit en Swift, et MediaAsset en Objective-C. Cependant, je réecrit MediaAsset complètement sur Swift et maintenant à chaque fois que je suis en train de créer de nouveaux MediaAsset de SongPicker, Xcode throwes EXC_BREAKPOINT (code=1, sous-code=...) et mon application écrase.
Voici le code, qui est appelée lorsque l'utilisateur sélectionne la chanson:
private let mediaItems = MPMediaQuery.songsQuery().items as [MPMediaItem]
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
let item = filteredMediaItems[indexPath.row]
println("didSelectRowAtIndexPath")
println("item: \(item), url: \(item.assetURL.absoluteString)")
delegate?.songPickerViewController(self, didPickedAsset: MediaAsset(url: item.assetURL, type: .Audio))
}
Il génère en sortie de console:
didSelectRowAtIndexPath
item: <MPConcreteMediaItem: 0x174648340> 2369259457983598523, url: Optional("ipod-library://item/item.mp3?id=2369259457983598523")
puis il va à MediaAsset constructeur, qui ressemble à ceci:
init(url: NSURL, type: MediaAssetType){
println("new MediaAsset with url \(url.absoluteString)")
self.url = url
self.asset = AVURLAsset(URL: url, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
self.timeRange = CMTimeRangeMake(kCMTimeZero, self.asset.duration)
self.initialRate = CGFloat(max(self.asset.videoTrack!.nominalFrameRate / 30.0, 1.0))
self.rate = self.initialRate
self.type = type
}
il imprime à la console:
new MediaAsset with url Optional("ipod-library://item/item.mp3?id=2369259457983598523")
Et sur cette ligne, il écrase:
Le code qui crée de l'actif de AVURLAsset est exactement le même que c'était dans mon ancien ObjectiveC classe (où il a fonctionné parfaitement bien), donc le problème ne devrait pas appartenir à AVFoundation.
Quelqu'un sait ce que peut être la raison de l'écraser? Et comme de plus en plus question d'ordre général, les cas dans lesquels "EXC_BREAKPOINT (code=1, ..." se pose?
MODIFIER
Après la suppression de cette println déclaration, mon application encore écrase mais maintenant, montre ce code assembleur:
- Vous avez exception des points d'arrêt est allumé? Si vous éteindre le problème persiste?
- J'ai exception des points d'arrêt désactivé
- Qui points d'arrêt ne vous ont permis?
- J'ai supprimé tous les points d'arrêt
Vous devez vous connecter pour publier un commentaire.
Cette exception se produit lorsque la valeur en cours de descellés par le '!' opérateur est nul. Fixer la valeur nil et le code devrait fonctionner.
J'ai trouvé une réponse. L'erreur était dans
self.asset.videoTrack!.nominalFrameRate
, parce que dans le cas d'unaudio asset.videoTrack
sera nul, c'est pourquoi l'application se bloque.Juste ne sais pas pourquoi il se comporte étrangement, pointant une erreur à
println()
ligne. Doit être l'un des tonnes de Xcode estswift
les bugs liés à laCette erreur peut également être due si vous expédier quelque chose sur la file d'attente principale de façon synchrone à l'intérieur d'un asynchrones bloc, qui arrive à courir sur la file d'attente principale ainsi:
Dans ce cas, votre code sera exécuté dans un blocage causé par le fait que l'asynchrone bloc ne sera pas complète jusqu'à ce que la machine synchrone à bloc complet, et il ne démarre pas jusqu'à ce que l'asynchrone bloc complet.
J'ai connu le même problème, j'ai essayé Shift+Cmd+K pour nettoyer le projet et il a résolu le problème, mais je ne sais pas pourquoi cela s'est produit !
Vous êtes de passage dans un
NSURL?
au lieu d'uneNSURL
.Vous pouvez aussi avoir besoin de déballer
assetURL
selon le type d'objet dansfilteredMediaItems
(assetURL
peut être facultatif).absoluteString()
.