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
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
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
Ich hatte meine Eigenschaft Code. Ich habe auch eine Autorelease auf meinem Player hinzugefügt, aber ich habe immer noch den gleichen Fehler. – Bruno