В двух словах, мое приложение делает это:
1) Мой основной вид (RootViewController) имеет кнопку, когда я нажимаю на нее, он отображает проигрыватель (PlayerViewController):
2) В моем проигрывателе я инициализирую видео, которое хочу воспроизвести
-> Это работает хорошо, мой фильм отображается
Моя проблема:
Когда я возвращаюсь к своему основному виду:
И я снова нажимаю на кнопку, я получаю * полученный программный сигнал: «EXC_BAD_ACCESS». *
Если я комментирую self.player.contentURL = [self movieURL];
, этоработает, но когда я это позволил, у меня возникла эта проблема.
Я прочитал, что это из-за нулевого указателя или проблемы с памятью, но я не понимаю, почему это работает в первый раз, а не во второй раз.Я освобождаю свой объект методом dealloc.
Спасибо за вашу помощь!
Bruno.
Вот мой код:
Root View Controller
RootViewController.h
#import <UIKit/UIKit.h>
#import "PlayerViewController.h"
@interface RootViewController : UIViewController {
IBOutlet UIButton * myButton;
}
@property (nonatomic,retain) IBOutlet UIButton * myButton;
-(IBAction)displayPlayer:(id)sender;
- (void) returnToRoot: (PlayerViewController *) controller;
@end
RootViewController.m
#import "RootViewController.h"
@implementation RootViewController
@synthesize myButton;
-(IBAction)displayPlayer:(id)sender
{
PlayerViewController *playerViewController = [[PlayerViewController alloc] initWithNibName:@"PlayerViewController" bundle:nil];
playerViewController.delegate = self;
playerViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController: playerViewController animated: YES];
[playerViewController release];
}
- (void) returnToRoot: (PlayerViewController *) controller
{
[self dismissModalViewControllerAnimated: YES];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
- (void)dealloc {
[super dealloc];
}
@end
Player ViewКонтроллер
PlayerViewController.h
#import <UIKit/UIKit.h>
#import <MediaPlayer/MPMoviePlayerController.h>
@protocol PlayerViewControllerDelegate;
@interface PlayerViewController : UIViewController {
UIView *viewForMovie;
MPMoviePlayerController *player;
}
@property (nonatomic, assign) id <PlayerViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UIView *viewForMovie;
@property (nonatomic, retain) MPMoviePlayerController *player;
- (NSURL *)movieURL;
-(IBAction)goBackToRoot:(id)sender;
@end
@protocol PlayerViewControllerDelegate
- (void) returnToRoot: (PlayerViewController *) controller;
@end
PlayerViewController.m
#import "PlayerViewController.h"
@implementation PlayerViewController
@synthesize player;
@synthesize viewForMovie;
@synthesize delegate;
- (void)dealloc {
[super dealloc];
[player release];
[viewForMovie release];
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad");
self.player = [[MPMoviePlayerController alloc] init];
[self.player autorelease];
self.player.view.frame = self.viewForMovie.bounds;
self.player.view.autoresizingMask =
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight;
[self.viewForMovie addSubview:player.view];
self.player.contentURL = [self movieURL];
[self.player play];
}
-(NSURL *)movieURL
{
NSBundle *bundle = [NSBundle mainBundle];
NSString *moviePath =
[bundle
pathForResource:@"myVideo"
ofType:@"mp4"];
if (moviePath) {
return [NSURL fileURLWithPath:moviePath];
} else {
return nil;
}
}
-(IBAction)goBackToRoot:(id)sender{
[self.delegate returnToRoot: self];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
@end
Проблема
Во второй раз, когда я вызываю "displayPlayer", у меня было EXC_BAD_ACCESS