MPMoviePlayerController будет проигрываться один раз, затем выдает ошибку - PullRequest
1 голос
/ 24 июля 2009

Я понимаю, что подобный вопрос был опубликован ранее, но я действительно не могу найти решение, которое работает для меня. У меня есть класс MoviePlayer, который хранит ивар MPMoviePlayerController, и у меня есть следующий метод в классе:

-(void)playMovie:(NSString *)movieName
{
    NSURL *movieURL;
    NSBundle *bundle = [NSBundle mainBundle];
    if(bundle)
    {
        NSString *moviePath = [bundle pathForResource:movieName ofType:@"m4v"];
        if(moviePath)
        {
            movieURL = [NSURL fileURLWithPath:moviePath];
        }
    }
    MPMovieController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    if(mp)
    {
        self.moviePlayer = mp;
        [mp release];

        [self.moviePlayer play];
    }
    [movieURL release];
}

При вызове я воспроизводлю фильм один раз, когда фильм воспроизводится нормально, но когда он вызывается снова надругой (или тот же) файл фильма Я получаю следующий стек ошибок:

_class_isInitialized
_class_lookupMethodAndLoadCache objc_msgSend
-[MoviePlayer setMoviePlayer:]
-[MoviePlayer playMovie:]

Я не уверен, как это исправить! Я предполагал, что когда вызывается self.moviePlayer = mp, то текущий moviePlayer освобождается, а новый добавляется? Для свойства установлено значение (неатомное, сохранение). Может кто-нибудь помочь, пожалуйста?

Спасибо

Ответы [ 2 ]

1 голос
/ 12 августа 2009

Я исправил эту проблему. Оказывается, с этим кодом была проблема:

movieURL = [NSURL fileURLWithPath: moviePath];

NSURL по каким-то причинам слишком рано автоматически высвобождался. Если я выделил для этого память и освободил ее сам, проблема перестала происходить.

Надеется, что это поможет другим людям.

Stu

1 голос
/ 24 июля 2009

Вы выпустили проигрыватель фильмов. Итак, он был освобожден.

Кажется, вы выпустили его в другом месте своего кода, возможно, в методе обратного вызова. Просто посмотрите на каждый экземпляр, который вы использовали.

moviePlayer теперь указывает на мусор. Поэтому, когда вы пытаетесь создать новый moviePlayer, ваш аксессор свойств пытается отправить сообщение об освобождении в мусор, хранящийся в moviePlayer.

, если вы хотите освободить moviePlayer между использованиями, не освобождайте его, вместо этого установите егона ноль.

[self setMoviePlayer:nil];

Тогда, когда вы попытаетесь создать его, вы не будете отправлять мусор.

...