iphone ios xcode 4.2 - сигнал EXC_BAD_ACCESS - PullRequest
0 голосов
/ 01 марта 2012

Ну, я разрабатываю приложение для iPhone, которое будет воспроизводить видео локально.Когда я нажимаю кнопку в симуляторе, он воспроизводится отлично, но когда он останавливается или когда я заканчиваю его вручную, он падает и продолжает вызывать эту проблему. Я пытался очистить, собрать, проанализировать и запустить снова, но все так же.Любая помощь?

Мой код таков:

MoviePlayerViewController.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <MediaPlayer/MediaPlayer.h>

@interface MoviePlayerViewController : UIViewController {

}
-(IBAction)playMovie:(id)sender;
@end

и основной бит в MoviePlayerViewController.m

- (IBAction)playMovie:(id)sender {
    NSString *movpath = [[NSBundle mainBundle] pathForResource:@"think" ofType:@"mp4"];
    MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc]
                                                     initWithContentURL:[NSURL fileURLWithPath:movpath]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinishedCallback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    [self.view addSubview:mpviewController.view];
    MPMoviePlayerController *mp = [mpviewController moviePlayer];
    [mp prepareToPlay];
    mp.scalingMode=MPMovieScalingModeAspectFill;
    [[mpviewController moviePlayer] play];
}

- (void)playbackFinishedCallback:(NSNotification *)notification {
    MPMoviePlayerViewController *mpviewController = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mpviewController];
    [mpviewController.view removeFromSuperview];
    [mpviewController release];
}

Ответы [ 2 ]

1 голос
/ 01 марта 2012

В коде есть несколько проблем, вот исправления:

1> Удалить [mpviewController release];, потому что он создан с использованием метода, который возвращает *autorelease* объект. ([notification object]).Чтобы освободить объект mpviewController, объявите его как переменную экземпляра, освободите его и сделайте его равным nil.

if(mpviewController != nil) 
{  
[mpviewController release];  
mpviewController = nil;
}

2> Поскольку вы объявили mpviewController в качестве переменной экземпляра, вам не нужно обращаться к mpviewController переменная через [notification object], потому что ее нет, поскольку вы не указали ее, когда добавляете наблюдателя в центр уведомлений.

3> Замените следующую строку кода:

 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mpviewController];

на

 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

Объяснение: Когда вы добавляете наблюдателя, вы не предоставляете никакой информации об объекте, но во время удаления вы

Так что теперь ваш код станет:

- (void)playbackFinishedCallback:(NSNotification *)notification {

    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
    [mpviewController.view removeFromSuperview];
   if(mpviewController != nil)
    {
        [mpviewController release];
        mpviewController = nil;
     }
}

Такжев - (void) dealloc этого контроллера вы должны написать аналогичный код для освобождения mpviewController.

Спасибо,

0 голосов
/ 01 марта 2012

Вы пытались сделать контроллер проигрывателя фильмов на ИВАР

  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import <MediaPlayer/MediaPlayer.h>

  @interface MoviePlayerViewController : UIViewController {

  }

  @property (nonatomic, retain) MPMoviePlayerViewController *mpviewController;

  -(IBAction)playMovie:(id)sender;
  @end

Тогда вы можете сделать что-то подобное в файле реализации

  @synthesize mpviewController;

  - (IBAction)playMovie:(id)sender {
      NSString *movpath = [[NSBundle mainBundle] pathForResource:@"think" ofType:@"mp4"];
      MPMoviePlayerViewController *mpController = [[MPMoviePlayerViewController alloc]
                                                       initWithContentURL:[NSURL fileURLWithPath:movpath]];

      self.mpviewController = mpController; 
      [mpController release];                                              

      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinishedCallback:)
                                                   name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

      [self.view addSubview:self.mpviewController.view];
      MPMoviePlayerController *mp = [self.mpviewController moviePlayer];
      [mp prepareToPlay];
      mp.scalingMode=MPMovieScalingModeAspectFill;
      [[self.mpviewController moviePlayer] play];
  }

  - (void)playbackFinishedCallback:(NSNotification *)notification {

      [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:mpviewController];
      [mpviewController.view removeFromSuperview];
  }

  - (void)viewDidUnload {
    self.mpviewController = nil;
  }

  - (void)dealloc{
    self.mpviewController = nil;

    [super dealloc];
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...