Xcode EXC_BREAKPOINT (code=1, subcode=...) 打印时 url
Xcode EXC_BREAKPOINT (code=1, subcode=...) when printing url
我自己的程序中有一个奇怪的错误。我目前正在开发视频编辑应用程序。我有一个 SongPicker 视图控制器,它显示用户音乐应用程序中的所有歌曲。当用户选择一首歌曲时,将创建一个表示该歌曲的新对象 (MediaAsset)。当 SongPicker 用 Swift 编写,MediaAsset 用 Objective-C 编写时,它工作得很好。然而,我在 Swift 上完全重写了 MediaAsset,现在每次我尝试从 SongPicker 创建新的 MediaAsset 时,Xcode 抛出 EXC_BREAKPOINT (code=1, subcode=...) 和我的应用粉碎。
这是用户选择歌曲时调用的代码:
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 class 中完全相同(它运行得非常好),所以问题不应该属于 AVFoundation。
有谁知道迷恋的原因是什么?作为更一般的问题,在哪些情况下会出现 "EXC_BREAKPOINT (code=1, ..."?
编辑
删除此 println 语句后,我的应用程序仍然崩溃,但现在显示此汇编代码:
您传递的是 NSURL?
而不是 NSURL
。
根据 filteredMediaItems
中的对象类型,您可能还需要解包 assetURL
(assetURL
可能是可选的)。
我找到了答案。错误出现在 self.asset.videoTrack!.nominalFrameRate
中,因为如果 audio asset.videoTrack
将为零,这就是应用程序崩溃的原因。
只是不知道为什么它的行为如此奇怪,在 println()
行指出错误。一定是 Xcode 的 swift
相关错误中的一个
当值被“!”解包时会发生此异常。运算符为零。修复 nil 值,代码应该可以工作。
我遇到了同样的问题,我尝试了 Shift+Cmd+K 清理项目并解决了问题,虽然我不知道为什么会这样!
如果您在异步块内同步调度主队列上的某些内容,也可能会导致此错误,主队列上的 运行 也会发生这种情况:
dispatch_async(dispatch_get_main_queue(), ^{ // This might happen unintentionally.
dispatch_sync(dispatch_get_main_queue(), ^{
// Do stuff.
});
});
在这种情况下,您的代码将 运行 陷入死锁,原因是异步块在同步块完成之前不会完成,并且在异步块完成之前不会启动。
我自己的程序中有一个奇怪的错误。我目前正在开发视频编辑应用程序。我有一个 SongPicker 视图控制器,它显示用户音乐应用程序中的所有歌曲。当用户选择一首歌曲时,将创建一个表示该歌曲的新对象 (MediaAsset)。当 SongPicker 用 Swift 编写,MediaAsset 用 Objective-C 编写时,它工作得很好。然而,我在 Swift 上完全重写了 MediaAsset,现在每次我尝试从 SongPicker 创建新的 MediaAsset 时,Xcode 抛出 EXC_BREAKPOINT (code=1, subcode=...) 和我的应用粉碎。
这是用户选择歌曲时调用的代码:
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 class 中完全相同(它运行得非常好),所以问题不应该属于 AVFoundation。 有谁知道迷恋的原因是什么?作为更一般的问题,在哪些情况下会出现 "EXC_BREAKPOINT (code=1, ..."?
编辑
删除此 println 语句后,我的应用程序仍然崩溃,但现在显示此汇编代码:
您传递的是 NSURL?
而不是 NSURL
。
根据 filteredMediaItems
中的对象类型,您可能还需要解包 assetURL
(assetURL
可能是可选的)。
我找到了答案。错误出现在 self.asset.videoTrack!.nominalFrameRate
中,因为如果 audio asset.videoTrack
将为零,这就是应用程序崩溃的原因。
只是不知道为什么它的行为如此奇怪,在 println()
行指出错误。一定是 Xcode 的 swift
相关错误中的一个
当值被“!”解包时会发生此异常。运算符为零。修复 nil 值,代码应该可以工作。
我遇到了同样的问题,我尝试了 Shift+Cmd+K 清理项目并解决了问题,虽然我不知道为什么会这样!
如果您在异步块内同步调度主队列上的某些内容,也可能会导致此错误,主队列上的 运行 也会发生这种情况:
dispatch_async(dispatch_get_main_queue(), ^{ // This might happen unintentionally.
dispatch_sync(dispatch_get_main_queue(), ^{
// Do stuff.
});
});
在这种情况下,您的代码将 运行 陷入死锁,原因是异步块在同步块完成之前不会完成,并且在异步块完成之前不会启动。