私はそうのよう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)>
AVPlayerItemTrack
上assetTrack
のタイプはvar assetTrack: AVAssetTrack { get }
あるので、これは、起こることになっていません。しかし、明らかにこれは真実ではありません。
(ビデオのすべての処理がメインスレッドで実行されます)
あなたはレーダーをファイルしましたか?明らかにApple側のバグです。私はそれがobjective-cで書かれていて、公開された迅速な定義が間違っているか、obj-cコードがSwiftが行う安全性を持たないのでオプションのように扱っているかのいずれかです。 私はSwift 4に変換されるまで私はこのクラッシュを見なかったということです。Swift 3 + iOS 11はクラッシュしていませんでした。 – jriskin
私はレーダーを提出しなかった。 –