2015-10-20 81 views
1

我得到NSInternalInconsistencyException錯誤,每當我嘗試從使用AVPlayer的URL流的歌曲。我在結構體上創建一個全局流播放器,這樣我的流播放器就可以在全局中使用。如何解決NSInternalInconsistencyException?

這裏是我的代碼玩一首新歌:

User.songPlayer = AVPlayer(URL: NSURL(string: User.streamSongUrl!)!) 
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: User.songPlayer?.currentItem) 
User.songPlayer?.addObserver(self, forKeyPath: "status", options: [], context: nil) 

slidetimer = NSTimer.scheduledTimerWithTimeInterval(0.0, target: self, selector: "updateSlider", userInfo: nil, repeats: true) 
progressBar.hidden = true 
progressTimerLabel.text = "PREVIEW" 
progressMinTimeLabel.hidden = true 

,這裏是錯誤日誌:

二〇一五年十月二十日10:00:41.453 joove [6466:141737] ***因未捕獲異常'NSInternalInconsistencyException'而終止應用程序,原因:'AVPlayer類的實例0x7f88138c2490已被釋放,而鍵值觀察者仍在其中註冊。現有的觀測信息:( 語境:爲0x0,物業:0x7f8815e6ca70> )」

我該如何解決呢? 給我任何建議無所謂obj-c或swift

+0

那麼,錯誤信息是非常清楚,你已經非常好的代碼。你正在爲'User.songPlayer'添加一個KVO觀察者,但後來'User.songPlayer'已經不存在了,大概是因爲'User'已經不存在了,沒有你刪除觀察者。你絕不能讓這種事情發生。 – matt

回答

0

錯誤很明顯。您向AVPlayer添加了觀察者,但在AVPlayer解除分配之前,您並未刪除觀察者。

更新您的代碼,在玩家取消分配之前,致電removeObserver,致電User.songPlayer

+0

我不知道何時User.songPlayer完全釋放,你能給我更明確的解釋嗎? –

+0

您不提供足夠的信息。也許你應該爲你的User類添加一個'deinit'函數。或者,當「自我」與玩家一起完成時,您應該將「self」作爲觀察者移除。 – rmaddy

+0

用戶是一個結構,因此我無法在用戶上添加deinit。在User.songPlayer = AVPlayer(URL:NSURL(string:User.streamSongUrl!!)!)之前,我嘗試添加User.songPlayer?.removeObserver(self,forKeyPath:「status」,context:nil)'' * 2015-10-20 10:53:46.646 joove [8869:181039] ***由於未捕獲異常'NSRangeException',原因:'無法爲關鍵路徑「status」刪除觀察者來自,因爲它沒有被註冊爲觀察者。'** –

0

NSInternalInconsistencyException的一個常見原因是不會從KVO註銷導致不必要的崩潰,因爲回調會傳遞給已釋放的對象。

請確保您在釋放時從所有通知中刪除您的班級觀察員。這樣的事情:

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    User.songPlayer.removeObserver(self, forKeyPath: "status") 
} 
+0

這不是問題所在。它是'AVPlayer'上的觀察者,而不是導致此崩潰的'NSNotificationCenter'。儘管這個答案中的代碼也應該添加。 – rmaddy

+0

是的你是對的@rmaddy。我急着想念那條路。現在更正了我的代碼。謝謝! – Abhinav

+0

這仍然不夠。這仍然沒有處理'self.songPlayer'在'self'之前被釋放,這是問題中的問題。 – rmaddy