2016-05-22 3 views
0

Я добавляю анимированный UIImageView (взрыв) к виду, но он, кажется, не сохраняется. Вот реализация класса взрывобезопасности, подкласс UIImageView:IOS UIImageView удаляется

@implementation Explosion 

#define EXPLOSION_DIMENSION 20 

- (instancetype)initAtPoint:(CGPoint)point { 
    if (self = [super initWithFrame:CGRectMake(0, 0, EXPLOSION_DIMENSION, EXPLOSION_DIMENSION)]) { 
     self.center = point; 
     self.image = [UIImage imageNamed:@"explosion.png"]; 
    } 
    return self; 
} 

- (void)boom { 
    self.alpha = 0; 
    [UIView animateWithDuration:0.5 
         delay:1.0 
         options: UIViewAnimationOptionCurveLinear 
        animations:^{ 
            self.alpha = 1; 
        }completion:^(BOOL finished){ 
         NSLog(@"here"); 
         // [self removeFromSuperview]; 
        }]; 
} 

@end 

При достижении точки прерывания на NSLog (@ «здесь»), отладчик не показывает себя. А? Любая ссылка на self в коде завершения вызывает сбой, поэтому я не могу сделать [self removeFromSuperview].

Вот код в представлении, где конкретизируется:

Explosion * explosion = [[Explosion alloc] initAtPoint:p]; 
    [_explosionImageViews addObject:explosion]; 
    [self addSubview:explosion]; 
    [explosion boom]; 
    NSLog(@"subviews: %d array: %d", self.subviews.count, _explosionImageViews.count); 

Представление содержит 8 других подвидов. Результат выглядит следующим образом:

subviews: 9 array: 1 
subviews: 10 array: 2 
subviews: 9 array: 3 

Обратите внимание, что количество подвидов возвратов до 9. Нигде я удалить взрыв из его надтаблицы, это только кажется волшебным уходит (сбор мусора?). Иногда subviews.count получает до 23, прежде чем он волшебным образом сбрасывается до 9.

Я поместил массив _explosionImageViews только для того, чтобы сохранить объекты, чтобы они не выходили за пределы области видимости, хотя кажется, что добавление к подзонам представление должно уже делать это.

Ожидается, что анимация останется на 0,5 секунды, но останется намного дольше. Затем некоторые из них исчезают одновременно. Опять же, сбор мусора?

Любые идеи, что происходит?

+1

«Любая ссылка на« я »в коде завершения приводит к сбою« Ну, вам нужно подумать, почему это так. Что такое авария? Вы получаете свисающий указатель? Если это так, проблема в том, что какой-то код, который вы не показываете нам, - это удаление этого представления из интерфейса и его освобождение. Вам нужно отследить это. Включение NSZombies поможет вам. – matt

ответ

0

Вы правы - ваш объект взрыва не сохраняется.

Чтобы вы сохранить его, используйте strong property:

@property (strong, nonatomic) Explosion *explosion; 

Затем его экземпляр в вашей реализации, например, так:

self.explosion = [[Explosion alloc] initAtPoint:p]; 

Конечно, если ваш explosionImageViews в настоящее время сохраняются, затем следуют это свойство, чтобы увидеть, если он где-то выпущен.

Я надеюсь, что это поможет!