2

在幾句話,我的應用程序在做的是:EXC_BAD_ACCESS當我改變moviePlayer的contentURL

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

+1

您可以提供您的屬性代碼(?從@interface)在最低限度,如果「玩」是一個保留屬性,有內存泄漏。 (你可能會保留一個alloc,初始化MPMoviePlayerController。)它不能解決你的問題,但只是想指出它。 – Malaxeur 2010-12-22 17:53:13

+0

self.player = [[MPMoviePlayerController alloc] init];是不是一個好主意,你應該添加一個autorelease。玩家的財產應該定義它是否保留。編輯:雅Malaxeur說 – Joe 2010-12-22 17:56:53

回答

3

我解決了!!!

我期待在的MPMoviePlayerController看到什麼樣的變量是contentURL

(NSURL *)contentURL 

這意味着我也解放了。

我這樣做,在我的dealloc方法把一個空值:

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

如果我評論self.player.contentURL = [自movieURL];它的工作,但當我讓它, ,我有這個問題。

在這種情況下,contentURL如何聲明? @property的定義是否包括copyretain

相關問題