停止MPMoviePlayerController时EXC_BAD_ACCESS崩溃

时间:2013-11-07 16:23:36

标签: ios objective-c video

我在尝试停止通过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类中的一行会触发此MyVideo类的公共方法停止,如下所示:

[video stop];

通常可以正常使用。但偶尔我会在EXC_BAD_ACCESS的行上收到[videoController stop]错误。它前面的行,NSLog上的行,按预期输出到控制台。

当加载到videoController的视频仍在播放时,会发生此崩溃。但每次都不会发生。


有人能说出为什么会发生这种崩溃吗?我怀疑它是因为videoController不再在记忆中,尽管它是strong并且仍在使用中。

我是否正确地认为完全无法测试videoController以查看它是否仍在内存中?

我是否认为在使用视频控制器播放视频时绝对没有办法阻止它进入内存?

因此,当我不想再播放视频时,我没有尝试停止视频并关闭MyVideo课程,而是考虑将MyVideo类设置为nil,并且让ARC处理停止视频并从内存中清除它。这是正确的做法吗?这有什么不利之处吗?

我缺少这个问题的其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

使用EXC_BAD_ACCESS我的第一个调用端口是在我的调试方案中启用Zombie Objects。

这可以让您了解导致EXC_BAD_ACCESS的对象。只是要仔细检查它是你的videoController。

什么时候在MyVideo上调用你的停止功能

特定设备(iPad iPod)上的崩溃是否发生在特定操作系统的iOS 6,7上 它是同一个视频文件吗?

它无法随机打破必须有一些导致EXC_BAD_ACCESS

的模式

答案 1 :(得分:1)

我可能错了,但我觉得它是一个线程问题。我怀疑调用[myVideo stop]函数的线程不知道videoController(可能在主线程上初始化)。尝试使用以下内容调用主线程中的[videoController stop]

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

请告诉我这是否有效!