我在尝试停止通过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类的 public 方法停止,如下所示:
[video stop];

通常,此可以正常工作。但是偶尔我在EXC_BAD_ACCESS的行上遇到[videoController stop]错误。上面的那一行(上面带有NSLog的那一行)将按预期输出到控制台。

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

谁能说出为什么发生这种崩溃?我怀疑是因为videoController不再在内存中,尽管它已经是strong并仍在使用。

我是否正确地认为绝对没有办法测试videoController以查看其是否仍在内存中?

我是否正确地认为,在用于播放视频时,绝对没有办法强制videoController保留在内存中?

因此,当我不想再播放视频时,不再尝试停止视频并正确关闭MyVideo类,我现在正在考虑将MyVideo类设置为nil,然后让ARC处理停止视频并从中清除它。记忆。这是正确的方法吗?这样做有什么不利之处吗?

我还缺少其他解决此问题的方法吗?

最佳答案

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

这应该使您了解导致EXC_BAD_ACCESS的对象。再次仔细检查它是您的videoController。

什么时候在MyVideo上调用stop函数

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

它不能随机中断,必须存在某种导致EXC_BAD_ACCESS的模式

08-18 09:31