Почему эта анимация UIImageView утечка? - PullRequest
0 голосов
/ 14 апреля 2011

После запуска моего приложения с использованием Leaks я обнаружил следующую утечку. Утечки происходят там, где выделяются 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 Ответ

2 голосов
/ 14 апреля 2011

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

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

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

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

...