当我更改 moviePlayer contentURL 时 EXC_BAD_ACCESS

发布于 2024-10-08 23:29:03 字数 3652 浏览 0 评论 0原文

简而言之,我的应用程序正在这样做:

1)我的主视图(RootViewController)有一个按钮,当我点击它时,它会显示播放器(PlayerViewController):

2)在我的播放器中,我初始化要播放的视频

- >它运行良好,我的电影正在显示

我的问题:

当我返回主视图时:

我再次点击按钮,我收到*程序收到信号:“EXC_BAD_ACCESS”。*

如果我comment self.player.contentURL = [self movieURL]; 它正在工作,但是当我让它工作时,我遇到了这个问题。

我读到这是由于空指针或内存问题,但我不明白为什么它第一次工作而不是第二次工作。我在 dealloc 方法中释放我的对象。

感谢您的帮助 !

布鲁诺.

这是我的代码:

根视图控制器

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

玩家视图控制器

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

In few words, my application is doing that :

1) My main view (RootViewController) has a buton when I tap on it, it displays the player (PlayerViewController) :

2) In my Player, I initialize the video I want to play

-> It's working good, my movie is display

My problem :

When I go back to my main view :

And I tap again on the button, I get a *Program received signal: “EXC_BAD_ACCESS”.*

If I comment self.player.contentURL = [self movieURL]; it's working, but when I let it, iI have this problem.

I read that it's due to null pointer or memory problem but I don't understand why it's working the first time and not the second time. I release my object in dealloc method.

Thanks for your help !

Bruno.

Here is my code :

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 Controller

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

Problem

The second time I call "displayPlayer" I had the EXC_BAD_ACCESS

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苦妄 2024-10-15 23:29:03

我解决了!!!

我在 MPMoviePlayerController 上查看 contentURL 是什么类型的变量,

(NSURL *)contentURL

这意味着我也必须释放它。

我在 dealloc 方法中设置了 nil 值:

-(void) dealloc {
   [super dealloc];
   self.player.contentURL = nil;
   [player release];
   [viewForMovie release];
}

I solved it !!!

I look on the MPMoviePlayerController to see what kind of variable is contentURL

(NSURL *)contentURL

It means I have also to liberate it.

I do that in my dealloc method putting a nil value:

-(void) dealloc {
   [super dealloc];
   self.player.contentURL = nil;
   [player release];
   [viewForMovie release];
}
奈何桥上唱咆哮 2024-10-15 23:29:03

如果我评论 self.player.contentURL =
[自己的电影网址];它正在工作,但是
当我让它出现时,我遇到了这个问题。

那么,contentURL 是如何声明的呢? @property 定义是否包含 copyretain

If I comment self.player.contentURL =
[self movieURL]; it's working, but
when I let it, iI have this problem.

In that case, how is contentURL declared? Does the @property definition include copy or retain?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文