我和这个观察者有一个 AVPLayer
__weak typeof(self.player) myPlayer = self.player;
myself.timer = [myself.player addPeriodicTimeObserverForInterval:interval
queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
usingBlock: ^(CMTime time) {
if (myself.runAfterEveryFrame) {
Float64 currentTime = CMTimeGetSeconds([myPlayer currentTime]);
myself.runAfterEveryFrame(currentTime); // crashes here
}
}];
播放器已开启self.player
。
这个应用程序按顺序加载电影。当电影结束时,应用程序创建了一个全新的AVPlayer
,加载资产并将其存储在self.player
. 就像是:
AVPlayer *newPlayer = ... init new player
// load assets, create new periodic observers, etc.
// new player is ready
self.player = newPlayer;
这工作正常,但在播放 3 或 4 部电影后,它就崩溃了
myself.runAfterEveryFrame(currentTime); // crashes here
与myself = nil
.
这就是问题。有这个如果
if (myself.runAfterEveryFrame) {
Float64 currentTime = CMTimeGetSeconds([myPlayer currentTime]);
myself.runAfterEveryFrame(currentTime); // crashes here
}
runAfterEveryFrame
是在每一帧之后运行的代码块。如果myself
是nil
,这两行是如何执行的?这个怎么可能?
如果我自己是 nil 那么myself.runAfterEveryFrame
是nil
,并且里面的内容if
不应该运行,但是它在里面运行和崩溃if
。