iPad iOS SDK 8.4 中 ARC 下过度发布的 MPMoviePlayerController
Overreleased MPMoviePlayerController under ARC in iOS SDK 8.4 on iPad
从一个更大的项目的一部分创建了一个非常简单的(单一视图)示例项目。 它适用于 iOS SDK 8.3。
当您点击 "Show me" 按钮时,会出现一个视频(作为模态),2 秒后它会消失。看起来不错。但是片刻之后,应用程序崩溃了,因为 -dealloc 消息被发送到一个已经解除分配的对象。
[MPAVController release]: message sent to deallocated instance
这是我的示例项目(不要忘记 Video.mp4):
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "MediaViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Show me!" forState:UIControlStateNormal];
button.frame = CGRectMake(10.0, 10.0, 100.0, 30.0);
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)buttonTapped:(id)sender
{
MediaViewController *mediaVC = [[MediaViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:mediaVC animated:YES completion:^{
[self performSelector:@selector(dismissPresentedController) withObject:nil afterDelay:2.0];
}];
}
- (void)dismissPresentedController
{
[self.presentedViewController dismissViewControllerAnimated:YES completion:nil];
}
@end
媒体ViewController.h
#import <UIKit/UIKit.h>
@interface MediaViewController : UIViewController
@end
媒体ViewController.m
#import "MediaViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface MediaViewController ()
@property (nonatomic) MPMoviePlayerController *movieController;
@end
@implementation MediaViewController
- (void)viewDidLoad {
[super viewDidLoad];
MPMoviePlayerController *movieController = [[MPMoviePlayerController alloc] initWithContentURL:[[NSBundle mainBundle] URLForResource:@"Video" withExtension:@"mp4"]];
movieController.repeatMode = MPMovieRepeatModeOne;
movieController.controlStyle = MPMovieControlStyleNone;
movieController.scalingMode = MPMovieScalingModeAspectFill;
[movieController prepareToPlay];
self.movieController = movieController;
UIView *movieView = movieController.view;
movieView.frame = CGRectZero;
movieView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view insertSubview:movieView atIndex:0];
// Autolayout
NSDictionary *layoutNeededViews = NSDictionaryOfVariableBindings(movieView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[movieView]|"
options:0
metrics:nil
views:layoutNeededViews]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[movieView]|"
options:0
metrics:nil
views:layoutNeededViews]];
}
@end
如果我关闭 ARC,错误仍然存在(为媒体添加 -fno-objc-arc 标志ViewController.m 并添加此行
[movieController release];
在 属性 分配之后。
也用 Instruments 检查过:
问题发生在 iPad(一直),但在 iPhone.
上似乎不是问题
有人遇到过这个问题吗?
(可能是一个解决方案:下载 iOS 8.3 SDK 并用它制作存档)
干杯,
亚当
我的应用程序在 ios8.3 上运行良好,但在 8.4 上显示了这个过度发布的问题。在阅读您的问题之前,我一直以为我弄坏了一些东西我在 ios8.3
上试用了该应用程序
嗯..也许我已经解决了这个问题,试试吧(它已经对我有效 - 做了很多测试)
试试这个:
在您的 MediaViewController
add/override viewDidDisappear
方法中,如下所示:
func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
//just a small fix for error on iPad iOS8.4
self.movieController.stop()
}
如果它不起作用,也将其添加到 viewWillDisappear
- 对我有用。
从一个更大的项目的一部分创建了一个非常简单的(单一视图)示例项目。 它适用于 iOS SDK 8.3。
当您点击 "Show me" 按钮时,会出现一个视频(作为模态),2 秒后它会消失。看起来不错。但是片刻之后,应用程序崩溃了,因为 -dealloc 消息被发送到一个已经解除分配的对象。
[MPAVController release]: message sent to deallocated instance
这是我的示例项目(不要忘记 Video.mp4):
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "MediaViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Show me!" forState:UIControlStateNormal];
button.frame = CGRectMake(10.0, 10.0, 100.0, 30.0);
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)buttonTapped:(id)sender
{
MediaViewController *mediaVC = [[MediaViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:mediaVC animated:YES completion:^{
[self performSelector:@selector(dismissPresentedController) withObject:nil afterDelay:2.0];
}];
}
- (void)dismissPresentedController
{
[self.presentedViewController dismissViewControllerAnimated:YES completion:nil];
}
@end
媒体ViewController.h
#import <UIKit/UIKit.h>
@interface MediaViewController : UIViewController
@end
媒体ViewController.m
#import "MediaViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface MediaViewController ()
@property (nonatomic) MPMoviePlayerController *movieController;
@end
@implementation MediaViewController
- (void)viewDidLoad {
[super viewDidLoad];
MPMoviePlayerController *movieController = [[MPMoviePlayerController alloc] initWithContentURL:[[NSBundle mainBundle] URLForResource:@"Video" withExtension:@"mp4"]];
movieController.repeatMode = MPMovieRepeatModeOne;
movieController.controlStyle = MPMovieControlStyleNone;
movieController.scalingMode = MPMovieScalingModeAspectFill;
[movieController prepareToPlay];
self.movieController = movieController;
UIView *movieView = movieController.view;
movieView.frame = CGRectZero;
movieView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view insertSubview:movieView atIndex:0];
// Autolayout
NSDictionary *layoutNeededViews = NSDictionaryOfVariableBindings(movieView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[movieView]|"
options:0
metrics:nil
views:layoutNeededViews]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[movieView]|"
options:0
metrics:nil
views:layoutNeededViews]];
}
@end
如果我关闭 ARC,错误仍然存在(为媒体添加 -fno-objc-arc 标志ViewController.m 并添加此行
[movieController release];
在 属性 分配之后。
也用 Instruments 检查过:
问题发生在 iPad(一直),但在 iPhone.
上似乎不是问题有人遇到过这个问题吗?
(可能是一个解决方案:下载 iOS 8.3 SDK 并用它制作存档)
干杯,
亚当
我的应用程序在 ios8.3 上运行良好,但在 8.4 上显示了这个过度发布的问题。在阅读您的问题之前,我一直以为我弄坏了一些东西我在 ios8.3
上试用了该应用程序嗯..也许我已经解决了这个问题,试试吧(它已经对我有效 - 做了很多测试)
试试这个:
在您的 MediaViewController
add/override viewDidDisappear
方法中,如下所示:
func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
//just a small fix for error on iPad iOS8.4
self.movieController.stop()
}
如果它不起作用,也将其添加到 viewWillDisappear
- 对我有用。