анимация в xcode - PullRequest
       9

анимация в xcode

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

когда я делаю анимацию со следующим кодом:

NSArray *images=[NSArray arrayWithObjects:[UIImage imageNamed:@"shavit_1.png"],[UIImage imageNamed:@"shavit_1.png"],[UIImage imageNamed:@"shavit_2.png"],[UIImage imageNamed:@"shavit_3.png"],[UIImage imageNamed:@"shavit_4.png"],[UIImage imageNamed:@"shavit_5.png"],[UIImage imageNamed:@"shavit_6.png"],[UIImage imageNamed:@"shavit_7.png"],[UIImage imageNamed:@"shavit_8.png"],[UIImage imageNamed:@"shavit_9.png"],[UIImage imageNamed:@"shavit_10.png"],[UIImage imageNamed:@"shavit_11.png"],[UIImage imageNamed:@"shavit_12.png"],[UIImage imageNamed:@"shavit_13.png"],[UIImage imageNamed:@"shavit_14.png"],[UIImage imageNamed:@"shavit_15.png"],[UIImage imageNamed:@"shavit_16.png"],[UIImage imageNamed:@"shavit_17.png"],[UIImage imageNamed:@"shavit_18.png"],[UIImage imageNamed:@"shavit_19.png"],[UIImage imageNamed:@"shavit_20.png"],[UIImage imageNamed:@"shavit_21.png"],[UIImage imageNamed:@"shavit_22.png"],[UIImage imageNamed:@"shavit_23.png"],[UIImage imageNamed:@"shavit_24.png"],[UIImage imageNamed:@"shavit_25.png"],nil];


    shavitimage.animationImages=images;
    shavitimage.animationDuration=2.0;
    shavitimage.animationRepeatCount=1;
    [shavitimage startAnimating];

    [images release]; //release the used array 

    [self performSelector:@selector(animation_ends) withObject:nil afterDelay:2.0];//after 2 seconds put astatic image

    timer=[NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:NO];
}

-(void)animation_ends{
    [shavitimage stopAnimating];//the UIImageView return to static mode
    shavitimage.image=[UIImage imageNamed:@"shavit_25.png"];
    self.view.userInteractionEnabled=YES;
}

анимация работает хорошо, и приложение работает хорошо после окончания анимации. но когда я делаю анимацию со следующим кодом:

NSMutableArray *images=[NSMutableArray array]; //insrt the images dynamiclly
for(int i=1;i<=25;i++)
{
 NSString *file=@"shavit_"; 
 file=[file stringByAppendingFormat:@"%d",i];
 NSString *filePath = [[NSBundle mainBundle] pathForResource:file ofType:@"png"];
 [images addObject:[UIImage imageWithContentsOfFile:filePath]];
 [file release];    
 [filePath release];    
}   


shavitimage.animationImages=images;
shavitimage.animationDuration=2.0;
shavitimage.animationRepeatCount=1;
[shavitimage startAnimating];

[images release]; //release the used array 

[self performSelector:@selector(animation_ends) withObject:nil afterDelay:2.0];//after 2 seconds put astatic image

timer=[NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:NO];
}

-(void)animation_ends{
    [shavitimage stopAnimating];//the UIImageView return to static mode
    shavitimage.image=[UIImage imageNamed:@"shavit_25.png"];
    self.view.userInteractionEnabled=YES;
}

анимация работает хорошо, но она складывается после. Почему это происходит?

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Не отпускать автоматически выпущенный объект.

В этом суть.

Оценка цепочки событий: -

  1. Вы создаете автоматически выпущенный массив. Retain Count = 1 (will diminish by 1 in near future)
  2. UIImageView объект сохраняет массив при установке animationImages. Retain Count = 2
  3. Вы освобождаете массив. Retain Count = 1
  4. Пускает авто-релиз. Retain Count = 0 (object is deallocated)

Теперь UIImageView все еще думает, что ему принадлежит массив. Когда он пытается получить к нему доступ, это должно привести к ошибке. Если он не анимируется, а затем освобождается, он попытается отправить сообщение release удаленному экземпляру, что также должно вызвать сбой приложения. Все это справедливо допущение , так как мы не знаем, добавляет ли фреймворк какие-либо собственные вызовы управления памятью.

Теперь оба фрагмента кода имеют одну и ту же проблему и оба ненадежны.

Будьте добропорядочным гражданином и снимите вызов release.

0 голосов
/ 06 марта 2012
@synthesize myImage;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSMutableArray *a = [NSMutableArray array];
    //[a addObject: [UIViewController ]];
    [a addObject:[UIImage imageNamed:@"1.gif"]];
    [a addObject:[UIImage imageNamed:@"2.gif"]];
    [a addObject:[UIImage imageNamed:@"3.gif"]];
    [a addObject:[UIImage imageNamed:@"4.gif"]];
    [a addObject:[UIImage imageNamed:@"5.gif"]];
    [a addObject:[UIImage imageNamed:@"6.gif"]];
    [a addObject:[UIImage imageNamed:@"7.gif"]];

    //[myImage initWithFrame:CGRectMake(0, 0, 131, 125)];

    myImage.animationImages = a;
    myImage.animationDuration=5;
    myImage.animationRepeatCount=0;
    myImage.startAnimating;
    [self.view addSubview:myImage];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...