我自己的程序中有一个奇怪的错误。我目前正在开发视频编辑应用。我有一个SongPicker视图控制器,它显示用户音乐应用程序中的所有歌曲。当用户选择歌曲时,创建表示该歌曲的新对象(MediaAsset)。当SongPicker用Swift编写,MediaAsset用Objective-C编写时,它工作得很好。但是我在Swift上完全重写了MediaAsset,现在每次我都试图从SongPicker创建新的MediaAsset时,Xcode会抛出EXC_BREAKPOINT(代码= 1,子代码= ...)并且我的应用程序会崩溃。
以下是用户选择歌曲时调用的代码:
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))
}
它实际上会生成输出到控制台:
didSelectRowAtIndexPath
item: <MPConcreteMediaItem: 0x174648340> 2369259457983598523, url: Optional("ipod-library://item/item.mp3?id=2369259457983598523")
然后它转到MediaAsset构造函数,如下所示:
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
}
打印到控制台:
new MediaAsset with url Optional("ipod-library://item/item.mp3?id=2369259457983598523")
在这一行上,它粉碎了:
从AVURLAsset创建资产的代码与我在旧的ObjectiveC类中完全相同(它工作得非常好),因此该问题不属于AVFoundation。 有谁知道这种迷恋的原因是什么?而作为更一般的问题,在哪些情况下&#34; EXC_BREAKPOINT(代码= 1,......&#34;出现?
修改 删除此println语句后,我的应用程序仍然会崩溃,但现在显示此汇编程序代码:
答案 0 :(得分:10)
当值被'!'解包时会发生此异常运营商是零。修复nil值,代码应该可以工作。
答案 1 :(得分:6)
我找到了答案。错误发生在self.asset.videoTrack!.nominalFrameRate
,因为如果audio asset.videoTrack
将为零,那就是应用崩溃的原因。
只是不知道为什么它表现得如此奇怪,指向println()
行的错误。必须是大量Xcode的swift
相关错误之一
答案 2 :(得分:2)
如果您在异步块内在主队列上同步分派某些东西,而该事件恰好也在主队列上运行,也可能导致此错误:
dispatch_async(dispatch_get_main_queue(), ^{ // This might happen unintentionally.
dispatch_sync(dispatch_get_main_queue(), ^{
// Do stuff.
});
});
在这种情况下,由于异步块直到同步块完成才完成,并且异步块完成才开始,所以您的代码将陷入死锁状态。
答案 3 :(得分:1)
我遇到了同样的问题,我尝试使用Shift + Cmd + K清理项目并修复了问题,虽然我不知道为什么会这样!
答案 4 :(得分:0)
您传递的是NSURL?
而不是NSURL
。
您可能还需要打开assetURL
,具体取决于filteredMediaItems
中的对象类型(assetURL
可能是可选的)。