gpt4 book ai didi

objective-c - EXC_BAD_ACCESS 当我更改 moviePlayer contentURL

转载 作者:行者123 更新时间:2023-12-04 06:39:00 28 4
gpt4 key购买 nike

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

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

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

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

我的问题:

当我回到我的主 View 时:

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

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

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

谢谢你的帮助 !

布鲁诺。

这是我的代码:

根 View Controller

根 View Controller .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

根 View Controller .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

播放器 View Controller

播放器 View Controller .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

最佳答案

我解决了!!!

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

(NSURL *)contentURL

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

我在我的 dealloc 方法中设置了一个 nil 值:
-(void) dealloc {
[super dealloc];
self.player.contentURL = nil;
[player release];
[viewForMovie release];
}

关于objective-c - EXC_BAD_ACCESS 当我更改 moviePlayer contentURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4512014/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com