Почему эта анимация UIImageView протекает?

#ios #uiimageview #core-animation

#iOS #uiimageview #core-animation

Вопрос:

После запуска моего приложения с использованием утечек я обнаружил следующую утечку. Утечки происходят там, где выделяются shimmer и shimmerAnimation . Я не вижу, что могло бы вызвать эту утечку. Может ли кто-нибудь указать мне правильное направление?

 float duration = .5f;
NSArray *shimmer = [NSArray arrayWithObjects:
                    [UIImage imageNamed:@"shimmer_1.png"],
                    [UIImage imageNamed:@"shimmer_2.png"],
                    [UIImage imageNamed:@"shimmer_3.png"],
                    [UIImage imageNamed:@"shimmer_4.png"],
                    [UIImage imageNamed:@"shimmer_1.png"], nil];

UIImageView *shimmerAnimation = [[UIImageView alloc] initWithFrame:[self bounds]];
[UIView setAnimationDelegate:shimmerAnimation];
[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
[shimmerAnimation setAnimationImages:shimmer];
[shimmerAnimation setAnimationDuration:duration];
[shimmerAnimation setAnimationRepeatCount:1];
[shimmerAnimation startAnimating]; 
[self addSubview:shimmerAnimation];
[shimmerAnimation release];
  

Ответ №1:

Вы добавляете объект shimmerAnimation в качестве подвида self. Это сохранит ее. Если происходит утечка self, то ваша shimmerAnimation тоже будет протекать, и поскольку она сохраняет shimmer, она также будет протекать. Поэтому я бы проверил self, чтобы увидеть, что он делает.

Вызовы [UIImage imageNamed:…] кэшируют загружаемые изображения. Хотя я не думаю, что это связано с утечками.

О, и вы используете [UIView setAnimationDelegate:], но вы не вызываете [UIView BeginAnimation:], что означает, что didStopSelector никогда не будет вызван, и, следовательно, если вы используете это, чтобы удалить его из подвида (которым вы являетесь), этого не будет. Вот ваш наиболее вероятный виновник.

[UIView setAnimationDelegate:] и друзья используются для анимации UIView, не для анимации изображений UIImageView.

Комментарии:

1. Вау, поставь меня на мое место. Спасибо!