2012-01-21 3 views
1

(このコードをx秒ごとに実行するために)ブロックでコードを指定するタイマーを宣言している。タイマーブロックで使用されているメモリを解放するが、タイマーを停止するときに割り当てられる。

ユーザーがボタンをタップしたときにタイマーを開始したいので、IBActionである関数の中でタイマーを作成して再開します。

最後に、ブロックで管理されているデータが常に同じサイズであるため、タイマーが起動するたびにメモリの割り当てと解放を回避するために、メモリをブロックから__blockポインタとして割り当てますしかし、関数内で(このローカルスコープから宣言することはできません)。

すべてうまく動作しますが、別のボタンを使用してタイマーを数回停止して再起動したいので、関数に割り当てられたメモリを解放するにはどうすればいいですか? "開始ボタン"がタップされるたびにタイマーが起動するたびにタップされ、 "停止ボタン"がタップされたときに解放されるたびに割り当てる必要があります。 ¿このコード構造で可能ですか? ¿私がしたいことをする最善の方法は何ですか?

これはコードです:

dispatch_source_t creaTimer(uint64_t interval,uint64_t leeway, dispatch_queue_t queue,               dispatch_block_t block){ 

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);  

if (timer) 
    { 
    dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway); 
    dispatch_source_set_event_handler(timer, block); 
    } 
    return timer; 
} 


-(IBAction) begin{ 

    __block double *array; 
    array = (double*) malloc (512); 

    timer = creaTimer(5ull * NSEC_PER_SEC, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) 
        ,^{ 
         //it uses the space allocated in *array; 
        });  

    dispatch_resume(timer); 

} 

答えて

0

は、これは(あなたの.hファイルでそれを宣言することによって)「配列」インスタンス変数を作ることによって解決されていませんか?

ちょっと別の質問:GCDの低レベルAPIを本当に使いたいですか? NSTimerだけでも十分でしょうか?それともあなたのコードを正しく解釈しなかったのですか?

+0

Jodocus、私はあなたがviewDidLoadでメモリを割り当てることを言うと思います。その場合、どこでポインタを解放すべきですか? deallocに "free(array)"と書かなければならないのですか、それとも必要ありませんか? – angeleke

+0

私はNSTimerを使用しませんでした。なぜなら、それは低レベルのタイマーを使用するよりも重く、精度は劣ります。とにかく、私はそれについて考えていないので、それは暫定的な解決策ですが、おそらくそれを変更します。ありがとう – angeleke

関連する問題