【问题标题】:EXC_BAD_ACCESS when I change moviePlayer contentURL当我更改moviePlayer contentURL 时的EXC_BAD_ACCESS
【发布时间】:2011-05-29 13:27:59
【问题描述】:

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

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

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

-> 效果很好,我的电影正在放映中

我的问题:

当我回到我的主视图时:

然后我再次点击按钮,我得到一个*程序接收信号:“EXC_BAD_ACCESS”。*

如果我评论 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

【问题讨论】:

  • 您能否提供您的属性代码(来自@interface?) 至少,如果“play”是一个保留属性,那么您就有内存泄漏。 (你可能会保留一个分配的、初始化的 MPMoviePlayerController。)它并不能解决你的问题,只是想指出它。
  • self.player = [[MPMoviePlayerController alloc] init];不是一个好主意,您应该为此添加自动释放。 player 的属性应定义是否保留。编辑:是的,Malaxeur 说了什么
  • 我有我的房产代码。我还在我的播放器上添加了一个自动释放,但我仍然有同样的错误。
  • 我把我所有的代码都放在了我的问题中。目前,我还没有找到解决方案,我还在尝试......

标签: objective-c memory-leaks release mpmovieplayercontroller exc-bad-access


【解决方案1】:

我解决了!!!

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

(NSURL *)contentURL

意思是我也要解放它。

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

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

【讨论】:

    【解决方案2】:

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

    在这种情况下,contentURL 是如何声明的? @property 定义是否包括copyretain

    【讨论】:

    • 我编辑了我的代码以添加@property 和@interface。我没有声明 contentUrl,因为它是我在电影框架中定义的播放器 (MPMoviePlayerController) 的属性:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2014-01-15
    相关资源
    最近更新 更多