【问题标题】:Xcode EXC_BREAKPOINT (code=1, subcode=...) when printing url打印 url 时的 Xcode EXC_BREAKPOINT (code=1, subcode=...)
【发布时间】:2015-02-24 16:55:38
【问题描述】:

我自己的程序中有一个奇怪的错误。我目前正在开发视频编辑应用程序。我有一个 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 类中的代码完全相同(它工作得非常好),所以问题不应该属于 AVFoundation。 有谁知道那次暗恋的原因是什么?作为更一般的问题,在哪些情况下会出现“EXC_BREAKPOINT (code=1, ...”?

编辑 删除此 println 语句后,我的应用程序仍然崩溃,但现在显示此汇编代码:

【问题讨论】:

  • 是否开启了异常断点?如果关闭它们,问题是否仍然存在?
  • 我关闭了异常断点
  • 你启用了哪些断点?
  • 我已经删除了所有断点

标签: ios xcode swift memory


【解决方案1】:

当值被 '!' 解包时会发生此异常运算符为零。修复 nil 值,代码应该可以工作。

【讨论】:

  • 这不是唯一可能的原因
  • 他从来没有说过。这是一个完全公平的答案。而且由于OP的问题确实原来是一个空对象......
【解决方案2】:

如果您在异步块内同步调度主队列上的某些内容,也可能会导致此错误,该异步块也恰好在主队列上运行:

dispatch_async(dispatch_get_main_queue(), ^{    // This might happen unintentionally.
  dispatch_sync(dispatch_get_main_queue(), ^{
    // Do stuff.
  });
});

在这种情况下,您的代码将陷入死锁,这是由于异步块在同步块完成之前不会完成,并且在异步块完成之前不会启动。

【讨论】:

    【解决方案3】:

    我找到了答案。错误出现在self.asset.videoTrack!.nominalFrameRate 中,因为如果audio asset.videoTrack 为零,这就是应用程序崩溃的原因。 只是不知道为什么它的行为如此奇怪,指向println() 行的错误。一定是 Xcode 的大量 swift 相关错误之一

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,我尝试 Shift+Cmd+K 清理项目并解决了问题,虽然我不知道为什么会这样!

      【讨论】:

        【解决方案5】:

        您传递的是 NSURL? 而不是 NSURL

        根据filteredMediaItems 中的对象类型,您可能还需要解开assetURLassetURL 可能是可选的)。

        【讨论】:

        • 感谢您的回答,亚伦!实际上 item.assetURL 有 NSURL! 类型,并且用 MediaAsset(url: item.assetURL!, type: .Audio) 显式解开它并没有解决问题
        • 并且项目本身不是可选的(它具有 MPMediaItem 类型)并且插入代码会给出错误“条件绑定中的绑定值必须是可选类型”。
        • 对不起,我被日志中的“可选”甩了,但那是来自absoluteString()
        • 是的,你是对的,absoluteString() 返回可选
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多