正在删除IOS UIImageView

时间:2016-05-22 15:35:06

标签: ios objective-c animation

我正在为视图添加动画UIImageView(爆炸)但似乎不会被保留。这是Explosion类的实现,它是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上遇到断点时(@"此处为#34;),调试器显示没有自我。咦?在完成代码中对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在它神奇地重置为9之前最多可达23个。

我放入_explosionImageViews数组只是为了保留对象,所以它们不会超出范围,即使看起来添加到视图的子视图应该已经这样做了。

动画应该保持0.5秒左右,但要保持更长时间。然后其中几个都同时消失了。垃圾收集?

任何想法发生了什么?

1 个答案:

答案 0 :(得分:0)

你是对的 - 你的爆炸对象没有被保留。

要保留它,请使用strong property

@property (strong, nonatomic) Explosion *explosion;

然后,在您的实现中实例化它,如下所示:

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

当然,如果您的explosionImageViews被保留,请关注该属性,看看它是否在某个地方发布。

我希望有所帮助!