我正在为视图添加动画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秒左右,但要保持更长时间。然后其中几个都同时消失了。垃圾收集?
任何想法发生了什么?
答案 0 :(得分:0)
你是对的 - 你的爆炸对象没有被保留。
要保留它,请使用strong property
:
@property (strong, nonatomic) Explosion *explosion;
然后,在您的实现中实例化它,如下所示:
self.explosion = [[Explosion alloc] initAtPoint:p];
当然,如果您的explosionImageViews
被保留,请关注该属性,看看它是否在某个地方发布。
我希望有所帮助!