2009-07-24 13 views
1

これまで同様の質問が掲載されていましたが、私にとってはうまくいくソリューションが見つからないようです。 (映画は罰金果たし一度呼び出し、私は映画を再生するとMPMoviePlayerControllerは1回再生してからエラーをスローします

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

、それは異なるに再び呼び出されたときに:私はMPMoviePlayerControllerのIVARを保存するのMoviePlayerクラスを持っている、と私はクラスで以下のメソッドを持っていますまたは同じ)ムービーファイルには、私は次のエラー・スタックを取得:

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

私はそれを修正するかどうかはわかりません! self.movi​​ePlayer = mpが呼び出されると、現在のmoviePlayerが解放され、新しいものが追加されたと仮定しましたか?プロパティは(非原子的、保持)に設定されます。誰か助けてもらえますか?

ありがとうございました

答えて

1

あなたは映画プレーヤーをリリースしました。だから、割り当てが解除されました。

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

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

使用の間にmoviePlayerを割り当て解除する場合は、割り当てを解除せず、代わりにnilに設定します。

[self setMoviePlayer:nil]; 

次に、メッセージを作成しようとすると、ごみにメッセージを送信しません。

+0

お返事ありがとうございました。あなたの提案を試してみましたが、NSPopAutoreleasePool> [MPMoviePlayer Controller dealloc]メソッドでエラースタックを取得しました。私はコード内でMPMoviePlayerControllerをオートレリースしたことはありません。 MPMoviePlayerControllersはプールに自動的に追加されますか? –

+0

スタックを持っている場合は、ムービープレーヤーがリリースされた場所がわかります(うまくいけば)。 いいえ、initを使用したため、リリースするのはあなたの責任です(ココアメモリ管理)。 プレイヤーを解放するときに追跡する必要があります。 MPMoviePlayerのカテゴリを作成してから、releaseメソッドを実装することもできます。そのメソッドにブレークポイントを置き、呼び出されているときを見つけます。 –

1

この問題は修正されました。このコードが問題だったことがわかります:

movieURL = [NSURL fileURLWithPath:moviePath];

何らかの理由でNSURLの自動リリースが早すぎます。このためにメモリを割り当てて、それをリリースすれば、問題はなくなりました。

これは他の人に役立つことを期待しています。

stu

関連する問題