我在尝试停止通过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的模式