1

以前にも同様の質問が投稿されていることは承知していますが、自分に合った解決策が見つからないようです。MPMoviePlayerControllerのivarを格納するMoviePlayerクラスがあり、クラスには次のメソッドがあります。

-(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.movi​​ePlayer = mpが呼び出されると、現在のmoviePlayerが解放され、新しいmoviePlayerが追加されると思いましたか?プロパティは(非アトミック、保持)に設定されます。誰か助けてもらえますか?

ありがとう

4

2 に答える 2

1

I fixed this problem. Turns out this code was the problem:

movieURL = [NSURL fileURLWithPath:moviePath];

The NSURL was being autoreleased too early for some reason. If I allocated the memory for this and released it myself, then the issue stopped happening.

Hopes this helps other people.

Stu

于 2009-08-12T17:25:26.353 に答える
1

ムービー プレーヤーをリリースしました。そのため、割り当てが解除されました。

おそらくコールバックメソッドで、コードの他の場所でリリースしたようです。使用したすべてのインスタンスを探してください。

moviePlayer がガベージを指すようになりました。そのため、新しい moviePlayer を作成しようとすると、プロパティ アクセサーは、moviePlayer に格納されているガベージにリリース メッセージを送信しようとします。

次の使用までに moviePlayer の割り当てを解除したい場合は、割り当てを解除せずに nil に設定してください。

[self setMoviePlayer:nil];

次に、作成しようとすると、ガベージにメッセージを送ることはありません。

于 2009-07-24T14:40:29.203 に答える