2016-05-22 7 views
0

ビューにアニメーション化された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秒間滞在しているはずですが、ずっと長くなります。その後、それらのいくつかはすべて同時に消えます。もう一度、ガベージコレクション?

何が起こっているのですか?

+1

"完了コードの中の自己への参照は、クラッシュを引き起こします。"なぜ、それがどういうものなのか考える必要があります。何がクラッシュですか?あなたはぶら下がっているポインタを取得していますか?その場合、問題は、私たちが表示していないコードが、このビューをインタフェースから削除し、それをリリースすることです。あなたはそれを追跡する必要があります。 NSZombiesをオンにするとあなたを助けるでしょう。 – matt

答えて

0

あなたが正しいです - あなたの爆発物は保持されていません。そのように、あなたの実装では、それをインスタンス化し、その後

@property (strong, nonatomic) Explosion *explosion; 

:もちろん

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

、あなたのexplosionImageViewsが保持されている場合、その後、続く

あなたがそれを保持するために、strong propertyを使用そのプロパティは、それがどこかにリリースされているかどうかを確認する。

私はそれが助けてくれることを願っています!

関連する問題