2015-02-24 218 views
5

我在自己的程序中有一个奇怪的错误。我目前正在研究视频编辑应用程序。我有一个SongPicker视图控制器,它显示用户音乐应用程序中的所有歌曲。当用户选择歌曲时,创建代表该歌曲的新对象(MediaAsset)。当SongPicker用Swift编写时,它和Objective-C中的MediaAsset完全一样。不过,我在Swift上完全重写了MediaAsset,现在每次我试图从SongPicker创建新的MediaAsset时,Xcode都会抛出EXC_BREAKPOINT(code = 1,subcode = ...),并且我的应用程序崩溃。打印url时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") 

并在此行压伤: Crush screenshot

从AVURLAsset创造财富的代码是完全因为它是在我的旧的ObjectiveC类(在那里工作得很好)是相同的,所以这个问题不该不属于AVFoundation。 有没有人知道暗恋的原因是什么? ?随着越来越多的一般性的问题,在这种情况下,“EXC_BREAKPOINT(代码= 1,...”出现

编辑 删除此println语句,之后,我的应用程序仍然粉碎,但现在显示了这个汇编代码:Crush

+0

您是否打开异常断点?如果您关闭它们,问题是否仍然存在? – 2015-02-24 17:56:18

+0

我有异常断点关闭 – 2015-02-24 19:11:26

+0

您启用了哪些断点? – 2015-02-24 19:20:30

回答

6

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

0

你传递一个NSURL?代替NSURL的。

您可能还需要根据对象的filteredMediaItems类型(assetURL可能是可选的)解开assetURL

+0

感谢您的答案,亚伦!其实item.assetURL的类型是NSURL!,并且用MediaAsset(url:item.assetURL!)显式解开它,输入:。音频)没有解决问题 – 2015-02-24 17:08:53

+0

并且项目本身不是可选的(它具有MPMediaItem类型),并且插入代码会出现错误“绑定值在条件绑定中必须为可选类型”。 – 2015-02-24 17:15:29

+0

对不起,我在日志中被“可选”抛出,但是这是来自'absoluteString()'。 – 2015-02-24 17:55:50

9

这个异常发生在当值被'!'解包时,运算符为零。修复零值,代码应该工作。

+1

downvoter请解释为什么downvote? – 2016-02-08 05:01:41

1

我面临同样的问题,我试着用Shift + Cmd + K来清理项目,并修复了问题,虽然我不知道为什么发生了!

相关问题