когда переменная зомби или нет? - PullRequest
1 голос
/ 23 февраля 2012

Я хотел бы проверить, когда переменная является зомби, а когда нет, у меня есть функция, подобная этой, где вам нужно удалить из суперслоя, если она действительно существует, иногда она уже удалена, но, будучи зомби, это сбой в этой точке. Что я должен сделать, чтобы проверить, является ли переменная зомби или нет во время выполнения?

 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];

Любая помощь? заранее спасибо!

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Почему бы не установить вместо переменной значение nil, а затем проверить наличие nil.

0 голосов
/ 14 марта 2012

Кажется, у вас есть простая несогласованность в вашей первой реализации ---

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]];

Кстати, вы не можете определить "зомби"объект во время выполнения, потому что механизм зомби зависит от некоторой конфигурации системы (переменные среды и т. д.), которую вы не можете установить на компьютере вашего клиента.Это инструмент только для отладки, а не надлежащая методика разработки.Зомби - это ошибка в вашей программе.Зомби призваны помочь вам найти и устранить ошибки, связанные с памятью, которые в противном случае было бы очень трудно отследить.

...