ビューにアニメーション化された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にブレークポイントをヒットし、デバッガが何の自己を示しています。ここ爆発クラスの実装、UIImageViewのサブクラスです。ハァッ?補完コード内の自己への参照はクラッシュするので、[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にサブビューのリセットの数はどこにも私はそのスーパービューから爆発を削除しないでくださいということ、それだけで魔法のように(?ガベージコレクションを)離れて行くように思われます。ときどきサブビューカウントが23になってから、魔法のように9にリセットされます。
オブジェクトを保持するために_explosionImageViews配列を配置して、サブビューに追加されているように見えますビューはすでにこれを行う必要があります。
アニメーションは0.5秒間滞在しているはずですが、ずっと長くなります。その後、それらのいくつかはすべて同時に消えます。もう一度、ガベージコレクション?
何が起こっているのですか?
"完了コードの中の自己への参照は、クラッシュを引き起こします。"なぜ、それがどういうものなのか考える必要があります。何がクラッシュですか?あなたはぶら下がっているポインタを取得していますか?その場合、問題は、私たちが表示していないコードが、このビューをインタフェースから削除し、それをリリースすることです。あなたはそれを追跡する必要があります。 NSZombiesをオンにするとあなたを助けるでしょう。 – matt