Многократные представления iOS и проблема MPMoviePlayer - PullRequest
0 голосов
/ 06 июня 2011

У меня есть два контроллера представления, один - mainController, второй - movieController ...

После перехода обратно к mainController из movieController с [self.view removeFromSuperview]; воспроизведение видео в movieController по-прежнему воспроизводится как фоновый звук.

Я выпустил плеер, но понятия не имею.

@synthesize viewForMovie,player;
- (void)viewDidLoad {
    [super viewDidLoad];
    //background image
    self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"mits_bg.png"]];

    //gesture recognizer -to up
    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self
                                              action:@selector(handleSwipes:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionDown;
    [self.view addGestureRecognizer:swipeGesture];

    [swipeGesture release];

    //movie player
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(movieDurationAvailable:)
     name:MPMovieDurationAvailableNotification
     object:nil];

    **self.player = [[[MPMoviePlayerController alloc] init] autorelease];**
    //self.player.controlStyle = MPMovieControlStyleNone; // no control at all :)
    self.player.contentURL = [self movieURL];

    self.player.view.frame = self.viewForMovie.bounds;
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ;

    [self.viewForMovie addSubview:player.view];
    [self.player play];
}

//---gesture recognizer
- (IBAction) handleSwipes:(UIGestureRecognizer *) sender {
    UISwipeGestureRecognizerDirection direction = [(UISwipeGestureRecognizer *) sender direction];

    if (direction == UISwipeGestureRecognizerDirectionDown) {

        CATransition *transition = [CATransition animation];
        transition.duration = 0.75;

        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

        transition.type = kCATransitionPush;
        transition.subtype = kCATransitionFromBottom;

        transition.delegate = self;

        // Next add it to the containerView's layer. This will perform the transition based on how we change its contents.
        [self.view.superview.layer addAnimation:transition forKey:nil];
        [self.view removeFromSuperview];
        **self.player = nil;**
        //[player release]; // I give it a try like this also

    }
}

- (void)viewDidUnload {
    [super viewDidUnload];
    self.viewForMovie = nil;
    self.player = nil;
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [thumbnailScrollView release];
    [viewForMovie release];
    [onScreenDisplayLabel release];
    [player release];
    [super dealloc];
}

1 Ответ

0 голосов
/ 06 июня 2011

Вы удерживаете дважды, когда делаете это,

self.player = [[MPMoviePlayerController alloc] init];

Вы должны добавить autorelease сообщение к этому,

self.player = [[[MPMoviePlayerController alloc] init] autorelease];

Я не вижу релиза, кроме как в viewDidUnload и dealloc. Вы должны позвонить, как только вы удалите представление из суперпредставления. nil ing - лучший вариант, так как ваш вызов освобождения в dealloc будет на nil, а не на освобожденном объекте. Поэтому после удаления его из вида сделайте его nil таким,

self.player = nil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...