簡體   English   中英

如果未在塊內檢測到nil?

[英]If not detecting nil inside block?

我有這個觀察者的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是在每一幀之后運行的代碼塊。 如果myselfnil ,這兩行如何執行? 怎么可能?

如果我本人為nil,則myself.runAfterEveryFramenil ,並且if的內容不應運行,但是它正在運行並且在if崩潰。

假設myself是像myPlayer這樣的弱引用(您未在問題中說過),則可以隨時將其釋放,包括在if塊內部。 要解決此問題,請在您的代碼塊內創建一個強引用:

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

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

另外,您應該檢查CMTimeGetSeconds是否返回NaN或Infinity以確保安全。

第二次在異步塊中使用弱變量是不安全的,因此始終將弱變量強制轉換為塊內的強變量。 所以自我被軟弱地俘獲了,但是被擋住了

    __weak myType *weakType = self;

    //dispatch block

   //INSIDE block
    __strong myType *strongType = weakType;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM