2016-10-25 2 views
0

私はいくつかの実験をしようとしています。メモリリークを防止しようとしています

- (IBAction)btn1Action:(id)sender { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"popvc2id" sender:self]; 
    }); 

    NSLog(@"TAP"); 
} 

ボタンは、それがセグエを実行するために1秒かかりますし、このボタンをもう一度タップすると、それは二回セグエをトリガーするタップしますので、ViewControllerの2つのインスタンスが作成されます。

私は2つのインスタンスを見ることができますが、そのうちの1つはleaked VC objectです。

今私がやろうとしていますどのようなので、私はメモリリークを防ぐことができ、VC objectsの記録を保持し、第二OBJを破壊しようとする

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    VC2 *vc2 = [segue destinationViewController]; 
    [ary addObject:vc2]; 
    if(ary.count > 1) { 
     VC2 *vc = (VC2*)ary[1]; 
     vc = nil; 
     [ary removeObjectAtIndex:1]; 
    } 
    [ary removeAllObjects]; 
    NSLog(@"-> %@", vc2); 
} 

です。

しかし、それは動作しません、どのように私はそれを修正することができますか?メモリで書いた

+0

第2のタップを防ぐために、ブールFLAGを使用します。私の提案は、どのように実装するNSObject CancelPreviousRequest方法

を使用しています。 – AleyRobotics

+0

の後にdispatch_を呼び出す前にフラグをチェックして、問題がタップを2回実行していないことを確認しますか? – Joshua

+0

ローカル変数を 'nil'に設定すると**一般的にメモリから削除されません**。 iOS/ARCにオブジェクトの解放を強制することはできません。 – clemens

答えて

1

エラーをコンパイルすることができます。

- (IBAction)btn1Action:(id)sender { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayedAction) object:nil]; 
    [self performSelector:@selector(delayedAction) withObject:nil afterDelay:1]; 
} 

-(void)delayedAction{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [self performSegueWithIdentifier:@"popvc2id" sender:self]; 
    }); 
} 
1
- (IBAction)btn1Action:(id)sender { 
     __block UIButton * btn = (UIButton*) sender; 

     btn.enabled = NO; 

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"popvc2id" sender:self]; 
      btn.enabled = YES; 
     }); 


     NSLog(@"TAP"); 
    } 

あなたが以前の要求をキャンセルしたい場合は、ここで

+0

ユーザーは実際にこのダブルタップを実行し、セグのアクションをアクティブにすることができます。 – Joshua

+0

@Joshuaこの機能を削除しましたか? - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {...}あなたはもう必要ありません – AleyRobotics

+0

ああ申し訳ありませんがコードを誤読しました。 – Joshua

関連する問題