1

我想检查一个变量什么时候是僵尸,当它不是时,我有这样的功能,如果它真的存在,你必须从超级层中删除,有时它已经被删除了,但是作为一个僵尸,它正在崩溃在这一点上。我应该怎么做才能在运行时检查变量是否是僵尸?

 if (avPlayerLayer) {
         [avPlayerLayer removeFromSuperlayer];  
 }

我有这个代码来创建它:

if (!avPlayer) {
        avPlayer = [[AVPlayer alloc] initWithURL:movieURL];
    } else {
        [avPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:movieURL]];
        avPlayer.rate = 0.0f;
    }
}
avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

我应该做这样的事情吗?

if (!avPlayer) {
        avPlayer = [[AVPlayer alloc] initWithURL:movieURL];
    } else {
        avPlayer = nil;
        avPlayer = [[AVPlayer alloc] initWithURL:movieURL];
        avPlayer.rate = 0.0f;
    }
}
avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

有什么帮助吗?先感谢您!

4

2 回答 2

1

为什么不将变量设置为 nil,然后检查 nil。

于 2012-02-23T15:36:05.140 回答
0

看来您在第一次实施中有一个简单的不一致之处---

if (!avPlayer) {

    // This sets avPlayer to a retained object reference (retainCount==1)
    avPlayer = [[AVPlayer alloc] initWithURL:movieURL]; 
} else {
    // This sets avPlayer to an autoReleased object reference 
    // which will die as soon as the memory pool is drained next. 
    // You should have retained it before setting, and your problem will be gone.
    [avPlayer replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:movieURL]];
    avPlayer.rate = 0.0f;
}

我会使用:

[avPlayer replaceCurrentItemWithPlayerItem:[[AVPlayerItem playerItemWithURL:movieURL] retain]];

顺便说一句,您无法在运行时确定对象的“僵尸性”,因为僵尸机制取决于您无法在客户端计算机上设置的某些系统配置(环境变量等)。这是一个仅用于调试的工具,而不是一种适当的开发技术。僵尸是您程序中的错误。Zombies 旨在帮助您找到并消除与内存相关的错误,否则这些错误将很难追踪。

于 2012-03-13T20:30:46.913 回答