swift Xcode EXC_BREAKPOINT(code=1,subcode=...)当打印url时

nhn9ugyo  于 2023-11-16  发布在  Swift
关注(0)|答案(6)|浏览(221)

我在自己的程序中有一个奇怪的bug。我目前正在开发视频编辑应用程序。我有一个SongPicker视图控制器,它显示用户音乐应用程序中的所有歌曲。当用户选择一首歌曲时,一个新的对象(MediaAsset)代表这首歌的创建。它工作得很好,当SongPicker是用Swift写的,然而,我在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创建资产的代码与我的旧的AVIC类中的代码完全相同(在那里它工作得很好),所以问题不应该属于AVFoundation。有人知道这种崩溃的原因是什么吗?作为更一般的问题,在哪些情况下会出现“EXC_BREAKPOINT(code=1,.”?

EDIT删除这个println语句后,我的应用仍然崩溃,但现在显示这个汇编代码:

wh6knrhe

wh6knrhe1#

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

zvokhttg

zvokhttg2#

如果你在异步块中同步调度了主队列上的东西,也可能会导致这个错误,而异步块恰好也在主队列上运行:

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

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

zhte4eai

zhte4eai3#

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

m1m5dgzv

m1m5dgzv4#

我面临着同样的问题,我尝试了Shift+Cmd+K来清理项目,它修复了问题,虽然我不知道为什么会发生这种情况!

wko9yo5t

wko9yo5t5#

你传入的是NSURL?而不是NSURL
您可能还需要根据filteredMediaItems中的对象类型展开assetURLassetURL可能是可选的)。

mrfwxfqh

mrfwxfqh6#

在我的情况下,我面临这个问题,由于DispatchSemaphore。DispatchSemaphore signal()没有被称为失败的情况下,导致这一崩溃。

相关问题