2017-09-28 11 views
2

私はそうのようAVPlayerItemからトラックのプロパティをキー値監視しています:スキップするときiOS11がAVPlayerItemTrack.assetTrack.mediaTypeにクラッシュする(スレッド1:EXC_BAD_ACCESS(コード= 1、アドレス= 0x0の)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if context == &PlayerItemObserverContext { 
     [... more code...] 
     } else if keyPath == #keyPath(AVPlayerItem.tracks) { 
      if let playerItem = self.playerItem { 
       for track in playerItem.tracks where track.assetTrack.mediaType == AVMediaType.video { 
        // Do something with the track 
        break 
       } 
      } 
     } [... more code...] 

しかし、早送りここ

for track in playerItem.tracks where track.assetTrack.mediaType == AVMediaType.video { 

私のアプリがクラッシュしたXCodeの9デバッガがThread 1: EXC_BAD_ACCESS (code=1, address=0x0

を言う私ははっきりtrack.assetTrackがnilであることがわかります!

(lldb) po track.assetTrack 
<uninitialized> 
(lldb) po track 
<AVPlayerItemTrack: 0x1c80083b0, assetTrack = (null)> 

AVPlayerItemTrackassetTrackのタイプはvar assetTrack: AVAssetTrack { get }あるので、これは、起こることになっていません。しかし、明らかにこれは真実ではありません。

(ビデオのすべての処理がメインスレッドで実行されます)

答えて

3

ここ神話(この場合は4)スウィフトをプログラミングするときは、安全な環境であるということです。私が難しいことを学んだのは、言語が安全かもしれないが、ランタイムはそうではないということです。

(うまくいけば、一時的な)修正プログラムが次の操作を実行することです:

for track in playerItem.tracks where track.assetTrack != nil && track.assetTrack.mediaType == AVMediaType.video { 

であっても、コンパイラはXCodeのは文句ので、これは、愚かであると考えて:

Comparing non-optional value of type 'AVAssetTrack' to nil always returns true 

しかし、それはトリックを行い、そしてアプリはもうクラッシュしません!

がなくてものコードが動作しますが、iOS10とそれ以前のバージョンで修正されていますが、iOS11の重大な回帰があるようです。

+0

あなたはレーダーをファイルしましたか?明らかにApple側のバグです。私はそれがobjective-cで書かれていて、公開された迅速な定義が間違っているか、obj-cコードがSwiftが行う安全性を持たないのでオプションのように扱っているかのいずれかです。 私はSwift 4に変換されるまで私はこのクラッシュを見なかったということです。Swift 3 + iOS 11はクラッシュしていませんでした。 – jriskin

+0

私はレーダーを提出しなかった。 –

関連する問題