Приложение iPhone падает, исключая плохой доступ второй раз после выпуска в dealloc - PullRequest
1 голос
/ 05 января 2012

У меня сбой «Exc_Bad_Access». Я пишу следующий код.Любой из вас, если ответит, может быть очень полезным, спасибо.Я пытаюсь воспроизвести видео в альбомной ориентации, а приложение для отдыха остается в портретной ориентации.Следующий работает отлично, но когда я открываю его во второй раз, который вызывает openMoviePlayer во второй раз, он падает.Я знаю, что Exc_Bad_Access иногда непредсказуемо или точно указывает причину, но поверьте мне, это очень маленький код, и он вылетает здесь каждый раз, в то время как другой код в порядке, я уверен. И ДА, ЕСЛИ Я УДАЛЯЮ [релиз игрока] из dealloc, он работает нормально, но я знаю, что в то время счетчик удержания игрока равен 1, и это утечка памяти.

- (void) openMoviePlayer {

    VideoViewController *videoScreen = [VideoViewController new];

    UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:videoScreen];

    navContr.navigationBar.tintColor = kNavbarColor;

    [self presentModalViewController:navContr animated:NO];

    [videoScreen release];

    [navContr release];

}

VideoVIewController.m

- (void)viewDidLoad {

    [super viewDidLoad];

    player = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];

    player.movieSourceType = MPMovieSourceTypeStreaming;

    player.controlStyle = MPMovieControlStyleDefault;

    [player.view setFrame:CGRectMake(0.0, 0.0, 480.0, 270.0)];
    [self.view addSubview:player.view];

    [player play];
}

- (void)dealloc {

    [player release];

    [super dealloc];

}

Спасибо за помощь !!!

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Попробуйте этот код

VideoViewController *videoScreen = [VideoViewController new];

    UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:videoScreen];

    navContr.navigationBar.tintColor = kNavbarColor;

    [self presentModalViewController:navContr animated:NO];

    [navContr release];

 [videoScreen release];
0 голосов
/ 05 января 2012

Ваше приложение упало, почему, потому что вы пытаетесь освободить базовый объект, созданный с новым, в настоящее время работает

  • new не поддерживает пользовательские инициализаторы (например, initWithString)

  • alloc-init более явный, чем новый

  • new не обрабатывается в autorelease должным образом, чем alloc - init, поэтому вы освобождаете уничтоженный объект из памяти, что приводит к сбою приложения

    VideoViewController *videoScreen = [[VideoViewController alloc] init];
    
    UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:videoScreen];
    
    navContr.navigationBar.tintColor = kNavbarColor;
    
    [self presentModalViewController:navContr animated:NO];
    
    [videoScreen release];
    
    [navContr release];
    

    остальная часть вашего кода в порядке, потому что я использовал этот код для нашего приложения, он отлично работает, всего наилучшего.

0 голосов
/ 05 января 2012

если вы объявили player как свойство с сохранением, тогда вам нужно написать так:

MPMoviePlayerController* tmp = [[MPMoviePlayerController alloc] 
                                 initWithContentURL:movieURL];
self.player = tmp;
[tmp release];
self.player.movieSourceType = MPMovieSourceTypeStreaming;

..

и в dealloc:

self.player = nil;
...