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 にビデオの停止とメモリからのクリアを処理させることを考えています。これはこれを行う正しい方法ですか?これに何か不利な点はありますか?
私が見逃しているこの問題に対する他の解決策はありますか?