2011-05-21 3 views
0

hi Когда происходят определенные события, я вызываю несколько методов (разблокированные трофеи в игре), они появляются и исчезают под-просмотр. Ошибка (справа) происходит, когда эти события происходят одновременно и перекрываются. Как я могу убедиться, что «подожди свою очередь :)»? благодаряметод «Подождите свою очередь»!

-(void)trofeiLaunch:(int)x { 


    CGRect loseFrame = CGRectMake(0, 0, 480, 320); 
    TrofeoView = [[UIView alloc] initWithFrame:loseFrame]; 
    TrofeoView.alpha = 0.0; 
    [UIView beginAnimations:nil context:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:0.5]; 
    [UIImageView setAnimationDelegate:self]; 
    TrofeoView.alpha = 1.0; 
    [UIView setAnimationDidStopSelector:@selector(bridgeTrofei)]; 
    [UIView commitAnimations]; 
    [self.view addSubview:TrofeoView]; 
    [TrofeoView release]; 

      .... 

} 

-(void)bridgeTrofei { 

TrofeoView.alpha = 1.0; 
[UIView beginAnimations:nil context:self]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
[UIView setAnimationDuration:0.5]; 
[UIView setAnimationDelegate:self]; 
TrofeoView.alpha = 0.0; 
[UIView commitAnimations]; 
[self performSelector:@selector(deleteTrofei) withObject:self afterDelay:1.0]; 

} 


-(void)deleteTrofei { 


[TrofeoView removeFromSuperview]; 

NSLog(@"delete"); 

} 

Краш (справедливо) происходит, когда эти события происходят одновременно и перекрытия. Как я могу убедиться, что «подожди свою очередь :)»? спасибо

+0

Какой вид сбоя вы видите? – Anomie

+0

в основной строке выбора: int retVal = UIApplicationMain (argc, argv, nil, nil); в компиляторе: sharedlibrary apply-load-rules all Текущий язык: авто; в настоящее время объектив-c – Vins

ответ

1

Если вторая анимация начинается до завершения первой анимации, TrofeoView будет переназначена, и вы потеряете предыдущую ссылку. Вы также игнорируете правила управления памятью при выпуске TrofeoView в методе 'trofeiLaunch: `. Вы снова используете эту переменную с получением права собственности. Вы должны только освободить объект, если вы закончили с ним, а это не так.

Я думаю, что самая важная вещь, идущая по этому пути, состоит в том, чтобы убедиться, что три метода относятся к правильному объекту. Сначала по умолчанию нормально, поэтому вам нужно обрабатывать следующие два. Я сделал свой код для этого.

- (IBAction)start { 

    animatingView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)]; 
    animatingView.backgroundColor = [UIColor greenColor]; 
    animatingView.alpha = 0.0; 
    [UIView beginAnimations:@"Trophy Display" context:animatingView]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:0.5]; 
    [UIImageView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
    animatingView.alpha = 1.0; 
    [UIView commitAnimations]; 
    [self.window addSubview:animatingView]; 
} 

- (void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void *)context { 

    if ([animationID isEqualToString:@"Trophy Display"]) { 
     UIView *aView = (UIView *)context; 

     [UIView beginAnimations:nil context:aView]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationDelegate:self]; 
     aView.alpha = 0.0; 
     [UIView commitAnimations]; 
     [self performSelector:@selector(finishAnimation:) withObject:aView afterDelay:1.0]; 
    } 
} 

- (void)finishAnimation:(UIView*)aView { 
    [aView removeFromSuperview]; 
    [aView release]; 
} 

я пройти через context вид ко второму способу и withObject: части к третьему способу. Я надеюсь, что код сам объяснит. Дайте мне знать, если вы этого не получите.

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

+0

отлично !!! благодаря!!! и спасибо за информацию о памяти :) – Vins

Смежные вопросы