#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. Вау, поставь меня на мое место. Спасибо!