我在尝试停止通过 MPMoviePlayerController
播放的视频时遇到一些 EXC_BAD_ACCESS
问题。这是一些代码:
视频类:
@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];
这通常 工作正常。但偶尔我会在 [videoController stop]
的行上收到 EXC_BAD_ACCESS
错误。它前面的行,上面带有 NSLog
的行,按预期输出到控制台。
当加载到 videoController
中的视频仍在播放时,会发生此崩溃。但并非每次都会发生。
谁能说明为什么会发生这种崩溃?我怀疑这是因为 videoController
已不在内存中,尽管它 strong
并且仍在使用中。
我是否认为绝对没有办法测试 videoController 以查看它是否仍在内存中?
我是否认为绝对没有办法强制 videoController 在用于播放视频时保留在内存中?
因此,当我不想再播放视频时,我不会尝试停止视频并正确关闭 MyVideo
类,我现在只想设置 MyVideo
class 为 nil,让 ARC 处理停止视频并将其从内存中清除。这是这样做的正确方法吗?这样做会有什么缺点吗?
对于这个问题,我还缺少其他解决方案吗?
最佳答案
使用 EXC_BAD_ACCESS,我的第一个调用端口是在我的调试方案中启用僵尸对象。
这应该让您了解是什么对象导致了 EXC_BAD_ACCESS。只是为了仔细检查它是你的 videoController。
什么时候在 MyVideo 上调用你的停止函数
崩溃是否发生在特定设备上,iPad iPod,是否发生在特定操作系统的 iOS 6,7 上 是同一个视频文件吗?
它不能随机中断,一定有某种模式导致 EXC_BAD_ACCESS
关于ios - EXC_BAD_ACCESS 在停止 MPMoviePlayerController 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19841170/