這是挺早之前碰到的一個(gè)問(wèn)題,記在Evernote沒(méi)寫出來(lái),今天空了出來(lái)閑翻之前筆記時(shí)看到了就寫到這里逗余。
播放相冊(cè)視頻崩潰
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'
場(chǎng)景是這樣:當(dāng)前列表頁(yè)展示相冊(cè)里的照片和視頻,tap列表里的某個(gè)視頻進(jìn)入下一級(jí)詳情頁(yè),詳情頁(yè)面用AVPlayerItem創(chuàng)建一個(gè)AVPlayer對(duì)象渔隶,用AVPlayerViewControler播放相冊(cè)視頻,開始播放后點(diǎn)擊返回上一級(jí)列表頁(yè)洁奈,再點(diǎn)擊這個(gè)視頻進(jìn)入詳情頁(yè)播放间唉,閃退;假如我返回列表頁(yè)換一個(gè)視頻進(jìn)入詳情頁(yè)播放利术,正常播放呈野。AVPlayerItem對(duì)象是在列表頁(yè)創(chuàng)建然后屬性傳進(jìn)詳情頁(yè),AVPlayer對(duì)象是在詳情頁(yè)創(chuàng)建的印叁。崩潰信息就是上面的
'*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'被冒。
看崩潰信息字面意思就是一個(gè)AVPlayerItem對(duì)象不能被放在不同的AVPlayer對(duì)象上播放。對(duì)應(yīng)我的場(chǎng)景也確實(shí)是這樣轮蜕,一個(gè)AVPlayerItem對(duì)象被不同的AVPlayer對(duì)象持有了昨悼。問(wèn)題來(lái)了,AVPlayerItem對(duì)象是在列表頁(yè)創(chuàng)建的跃洛,在這個(gè)場(chǎng)景下始終沒(méi)有被釋放率触,AVPlayer對(duì)象是在詳情頁(yè)創(chuàng)建的,每次返回列表頁(yè)AVPlayer對(duì)象都已經(jīng)被釋放了汇竭,卻依然出現(xiàn)崩潰葱蝗,猜測(cè)是AVPlayerItem對(duì)象依然被隱性持有著。這個(gè)問(wèn)題在iOS 11.0以后的設(shè)備上沒(méi)有復(fù)現(xiàn)(我測(cè)試了2臺(tái)11.0以后的設(shè)備)细燎,在11.0之前的系統(tǒng)必現(xiàn)(測(cè)試了3臺(tái)11.0之前的設(shè)備)两曼,所以蘋果可能在11.0系統(tǒng)修復(fù)了這個(gè)bug。
我搜了下這個(gè)bug找颓,回復(fù)基本上都是套用這個(gè)提問(wèn)的回答合愈,大致都是MPMoviePlayerViewController的使用場(chǎng)景,我的問(wèn)題是AVPlayerViewControler(iOS 8.0之后available)的使用場(chǎng)景击狮。
我解決這個(gè)問(wèn)題的辦法是把AVPlayer對(duì)象的創(chuàng)建也放在列表頁(yè)佛析,通過(guò)屬性傳進(jìn)詳情頁(yè),利用改變業(yè)務(wù)邏輯的方式替代彪蓬。