EXC_BAD_ACCESS, когда я меняю контент moviePlayerURL - PullRequest
2 голосов
/ 22 декабря 2010

В двух словах, мое приложение делает это:

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

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Я решил это !!!

Я смотрю на MPMoviePlayerController, чтобы увидеть, что это за переменная contentURL

(NSURL *)contentURL

Это значит, что я должен освободить ее.

Я делаю это в моем методе dealloc, помещая значение nil:

-(void) dealloc {
   [super dealloc];
   self.player.contentURL = nil;
   [player release];
   [viewForMovie release];
}
0 голосов
/ 22 декабря 2010

Если я прокомментирую self.player.contentURL = [self movieURL];это работает, но когда я позволю этому, у меня есть эта проблема.

В таком случае, как объявляется contentURL?Включает ли определение @property copy или retain?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...