2015-02-24 8 views
5

Ho uno strano bug nel mio programma. Attualmente sto lavorando all'app Video Editing. Ho un controller di visualizzazione SongPicker, che visualizza tutti i brani dall'app musicale dell'utente. Quando l'utente seleziona una canzone, viene creato un nuovo oggetto (MediaAsset) che rappresenta quella canzone. Ha funzionato perfettamente, quando SongPicker è stato scritto in Swift e MediaAsset in Objective-C. Tuttavia ho riscritto MediaAsset completamente su Swift e ora ogni volta che cerco di creare un nuovo MediaAsset da SongPicker, Xcode lancia EXC_BREAKPOINT (code = 1, subcode = ...) e la mia app si schiaccia.Xcode EXC_BREAKPOINT (codice = 1, sottocodice = ...) quando si stampa l'url

Ecco il codice, che viene chiamata quando l'utente seleziona canzone:

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)) 
} 

E 'in realtà genera output in console:

didSelectRowAtIndexPath 
item: <MPConcreteMediaItem: 0x174648340> 2369259457983598523, url: Optional("ipod-library://item/item.mp3?id=2369259457983598523") 

poi va a MediaAsset costruttore, che assomiglia a questo:

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 
} 

esso stampa alla console:

012.351.641.061.
new MediaAsset with url Optional("ipod-library://item/item.mp3?id=2369259457983598523") 

E su questa linea si schiaccia: Crush screenshot

Il codice che crea risorsa da AVURLAsset è esattamente lo stesso che era nella mia vecchia classe ObjectiveC (dove ha funzionato perfettamente bene), quindi il problema shouldn appartenere a AVFoundation. Qualcuno sa quale possa essere la ragione di quella cotta? ? E come questione più generale, in quali casi "EXC_BREAKPOINT (codice = 1, ..." si pone

EDIT Dopo l'eliminazione di questa dichiarazione println, la mia app schiaccia ancora, ma ora mostra questo codice assembler: Crush

+0

Sono stati attivati ​​punti di interruzione delle eccezioni? Se li spegni, il problema persiste? –

+0

I punti di interruzione eccezione sono disattivati ​​ –

+0

Quali punti di interruzione sono stati abilitati? –

risposta

6

Ho trovato una risposta. Errore nel self.asset.videoTrack!.nominalFrameRate, perché in caso di uno audio asset.videoTrack sarà nullo, ecco perché l'app si arresta in modo anomalo. Solo non so perché si comporta in modo così strano, indicando un errore sulla linea println(). Deve essere uno dei tanti bug relativi a Xcode swift

0

si sta passando in una NSURL? invece di un NSURL.

potrebbe anche essere necessario per scartare assetURL a seconda del tipo di oggetto in filteredMediaItems (assetURL può essere facoltativo).

+0

Grazie per la risposta, Aaron! In realtà item.assetURL ha tipo NSURL !, e lo spoglia esplicitamente con MediaAsset (url: item.assetURL !, tipo:.Audio) non risolve il problema –

+0

E l'elemento stesso non è opzionale (ha tipo MPMediaItem) e l'inserimento del codice restituisce un errore "Il valore associato nell'associazione condizionale deve essere di tipo facoltativo". –

+0

Mi dispiace, sono stato buttato fuori da "Opzionale" nel registro, ma quello è da 'absoluteString()'. –

9

Questa eccezione si verifica quando il valore viene srotolato da "!" l'operatore è zero. Correggere il valore nullo e il codice dovrebbe funzionare.

+1

Può il downlocoter spiegare perché il downvote? –

1

Ho affrontato lo stesso problema, ho provato Shift + Cmd + K per pulire il progetto e ha risolto il problema, anche se non so perché è successo!