2

In wenigen Worten, meine Anwendung, das zu tun:EXC_BAD_ACCESS wenn ich ändere Movieplayer contentURL

1) Meine Hauptansicht (RootViewController) eine buton hat, wenn ich darauf tippen, zeigt es den Spieler (PlayerViewController):

2) In meinem Player, initialisieren ich das Video, das ich

spielen wollen -> Es funktioniert gut, mein Film ist Anzeige

Mein Problem:

Als ich zu meinem Hauptansicht zurück:

Und ich tippen Sie erneut auf die Schaltfläche, erhalte ich ein * Programm-Signal empfangen. „EXC_BAD_ACCESS“ *

Wenn ich self.player.contentURL = [self movieURL]; kommentieren es funktioniert, aber wenn Ich lasse es, ich habe dieses Problem.

Ich habe gelesen, dass es wegen Nullzeiger oder Speicherproblem ist, aber ich verstehe nicht, warum es beim ersten Mal funktioniert und nicht beim zweiten Mal. Ich lasse mein Objekt in der Dealloc-Methode los.

Danke für Ihre Hilfe!

Bruno.

ist hier mein 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 

Spieler-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

Das zweite Mal, dass ich "displayPlayer" Ich hatte das EXC_BAD_ACCESS

+1

Können Sie Ihr Eigentum Code (? Vom @interface) Auf das Minimum liefern, wenn ‚Play‘ eine Eigenschaft behalten ist, Sie habe ein Speicherleck. (Möglicherweise behalten Sie einen zugewiesenen MPMoviePlayerController bei.) Es löst Ihr Problem nicht, sondern wollte es nur aufzeigen. – Malaxeur

+0

self.player = [[MPMoviePlayerController alloc] init]; ist keine gute Idee, Sie sollten eine Autorelease hinzufügen. Die Eigenschaft für Spieler sollte definieren, ob sie beibehalten wird oder nicht. Edit: Ya was Malaxeur sagte – Joe

+0

Ich hatte meine Eigenschaft Code. Ich habe auch eine Autorelease auf meinem Player hinzugefügt, aber ich habe immer noch den gleichen Fehler. – Bruno

Antwort

3

Ich löste es !!!

Ich sehe auf dem MPMoviePlayerController zu sehen, welche Art von Variable ist contentURL

(NSURL *)contentURL 

Es bedeutet, dass ich es auch zu befreien.

ich das in meiner dealloc Methode einen Nullwert setzen:

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

Wenn ich Kommentar self.player.contentURL = [self movieURL] nennen; es funktioniert, aber wenn ich es lasse, habe ich dieses Problem.

In diesem Fall, wie wird deklariert? Umfasst die @property Definition copy oder retain?

+0

Ich habe meinen Code bearbeitet, um @property und @interface hinzuzufügen. Ich habe contentUrl nicht deklariert, weil es eine Eigenschaft meines Players (MPMoviePlayerController) ist, die im Movie-Framework definiert ist: Bruno

Verwandte Themen