3

EXC_BAD_ACCESSで再生中のビデオを停止しようとすると、いくつかの問題が発生しMPMoviePlayerControllerます。ここにいくつかのコードがあります:

ビデオ クラス:

@interface MyVideo()
@property (nonatomic, strong) MPMoviePlayerController * videoController
@end

@implementation MyVideo
@synthesize videoController;

- (MyVideo*) initIntoView: (UIView*) view withContent (NSDictionary*) contentDict {
    self=[super init];
    NSString * rawUrl=[[NSString alloc] initWithFormat:@"http://.../%@.mp4", [contentDict objectForKey:@"filename"]];
    NSURL * videoUrl=[[NSURL alloc] initWithString:rawUrl];
videoController = [[MPMoviePlayerController alloc] initWithContentURL:videoUrl];
    videoController.movieSourceType=MPMovieSourceTypeFile;
    videoController.view.frame = viewRef.bounds;
    [videoController.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
    videoController.controlStyle=MPMovieControlStyleNone;
    [view addSubview:videoController.view];
    return self;
}

/* other code */

- (void) stop {
    NSLog(@"video stop");
    [videoController stop];
}

@end

このクラスは、次のようMyVideoに、私のクラス内のプロパティです。AppDelegate

@property (nonatomic, strong) MyVideo video;

私のクラスの行は、次のようAppDelegateに、このクラスの public メソッド stop を起動します。MyVideo

[video stop];

これは通常うまくいきます。しかし、時々EXC_BAD_ACCESS、行でエラーが発生し[videoController stop]ます。その前の行、その上にある行は、NSLog期待どおりにコンソールに出力されます。

このクラッシュは、 にロードされたビデオの再生中に発生しvideoControllerます。しかし、それは毎回起こるわけではありません。


このクラッシュが発生する理由を誰かが提案できますか? 私videoControllerは、それがまだ使用されているにもかかわらず、もはやメモリにないためだと思いstrongます。

videoController がまだメモリ内にあるかどうかをテストする方法がまったくないと考えているのは正しいですか?

ビデオの再生に使用されている間、videoController を強制的にメモリに保持する方法はまったくないと考えているのは正しいですか?

MyVideoそのため、ビデオを再生したくないときにビデオを停止してクラスを適切にシャットダウンしようとする代わりに、MyVideoクラスを nil に設定し、ARC にビデオの停止とメモリからのクリアを処理させることを考えています。これはこれを行う正しい方法ですか?これに何か不利な点はありますか?

私が見逃しているこの問題に対する他の解決策はありますか?

4

2 に答える 2

1

EXC_BAD_ACCESS を使用して最初に行うことは、デバッグ スキームでゾンビ オブジェクトを有効にすることです。

これにより、EXC_BAD_ACCESS の原因となっているオブジェクトがわかります。それがあなたのvideoControllerであることを再確認するだけです。

MyVideoで停止機能が呼び出されるのはいつですか

クラッシュは特定のデバイス、iPad iPod、特定の OS の iOS 6,7 で発生しますか? 同じビデオ ファイルですか?

EXC_BAD_ACCESS を引き起こしている何らかのパターンが存在する必要があります。

于 2013-11-07T16:39:25.707 に答える
1

私は間違っているかもしれませんが、スレッドの問題だと感じています。関数を呼び出すスレッド[myVideo stop]が videoController を認識していないと思われます(おそらくメインスレッドで初期化されています)。[videoController stop]次を使用して、メイン スレッド内でを呼び出してみてください。

dispatch_async(dispatch_get_main_queue(), ^{
       [videoController stop];
    });

これがうまくいくかどうか教えてください!

于 2013-11-07T16:46:27.567 に答える