2015-02-24 331 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來清理項目,並修復了問題,雖然我不知道爲什麼發生了!

相關問題