ios - 如果没有在 block 内检测到 nil ?

标签 ios cocoa block avplayer avplayeritem

我和这个观察者有一个 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,加载 Assets 并将其存储在 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 是在每一帧之后运行的代码块。如果myselfnil,这两行是如何执行的?怎么可能?

if myself is nil then myself.runAfterEveryFrame is nil, if 里面的内容不应该运行,但是它正在运行并且在 if 中崩溃。

最佳答案

假设 myself 是一个像 myPlayer 这样的弱引用(你没有在你的问题中说)它可以在任何时候被释放,包括在你的 if block 。要解决这个问题,请在您的 block 中创建一个强引用:

__strong typeof(myself) strongSelf = myself;
__strong typeof(myPlayer) strongPlayer = myPlayer;

if (strongSelf.runAfterEveryFrame) {
    Float64 currentTime = CMTimeGetSeconds([strongPlayer currentTime]);
    strongSelf.runAfterEveryFrame(currentTime);
}

另外,为了安全起见,您应该检查 CMTimeGetSeconds 是否返回 NaN 或无穷大。

关于ios - 如果没有在 block 内检测到 nil ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659946/

相关文章:

ios - 如何使用EventKit处理重复事件

ios - Metal 计算内核与片段着色器

objective-c - NSScanner - 将下一行扫描到字符串中

objective-c - 如何测试Cocoa应用程序和iOS应用程序之间的iCloud同步

objective-c - Mac 上使用 Objective-C 的图像处理资源

ios - 我应该在 block 中使用函数参数,还是将它们保留为 __block 变量

java - 在 Java 方法中使用大括号会降低性能吗?

html - 在页脚中放置 4 个带有文本的框

iphone - 如何接收连接类型已更改的通知(3G、Edge、Wifi、GPRS)

ios - Eureka Forms Swift 启用和禁用按钮