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); 

}
4

1 に答える 1

0

「array」をインスタンス変数にする(.hファイルで宣言する)ことで解決しませんか?

もう 1 つ質問があります。本当に GCD の低レベル API を使用しますか? NSTimer でも十分ではないでしょうか? または、あなたのコードを正しく解釈しませんでしたか?

于 2012-01-21T13:26:26.597 に答える