1

ディスパッチ キューを使用してタイマー イベントを生成しています。以下は、タスクを実行するコードです。

dispatch_queue_t キュー = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, キュー);
if (!timer) return self;
dispatch_source_set_timer(タイマー、dispatch_walltime(NULL、0)、間隔 * NSEC_PER_SEC、5 * NSEC_PER_SEC);

dispatch_source_set_event_handler(タイマー、
^{
    //いくつかの作業…
});

これは非常にうまく機能しますが、プロファイラーを実行すると、これらのメソッドから多くのメモリ リークが発生します。

  • dispatch_source_create
  • dispatch_source_set_timer
  • dispatch_source_set_event_handler

dispatch_release() メソッドを使用してタイマーが解放されることを確認しました。

上記のコードに誤りがある場合は、誰か教えていただけますか? また、タイマーイベント生成の例を指摘していただけると助かります。

4

1 に答える 1

4

dispatch_source_set_timer(3) Mac OS X マニュアル ページ

すべてのタイマーは、dispatch_source_cancel() が呼び出されるまで無期限に繰り返されます。

タイマーの dispatch_source_cancel() と dispatch_release() をどのように呼び出しますか?

ディスパッチ ソース タイマーの例:

dispatch_source_t timer = dispatch_source_create(
    DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));

dispatch_source_set_timer(timer,
    dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC),
        DISPATCH_TIME_FOREVER, 1ull * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer, ^{
    NSLog(@"wakeup!");

    dispatch_source_cancel(timer);
});

dispatch_source_set_cancel_handler(timer, ^{
    NSLog(@"canceled");

    dispatch_release(timer);
});

dispatch_resume(timer);
于 2011-04-13T00:43:16.340 に答える