14

(しかし、この質問はまったく異なります)

この非 ARC コード例は、GCD ベースのタイマーを設定し、dispatch_source_t オブジェクトの dispatch_release を呼び出します。

    __block BOOL done = NO;
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    if (timer) {
        uint64_t milliseconds = 100ull;
        uint64_t interval = milliseconds * NSEC_PER_MSEC;
        uint64_t leeway = 10ull * NSEC_PER_MSEC;
        __block typeof(self) _self = self;

        dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
        dispatch_source_set_event_handler(timer, ^{
            //[_progressBar setProgress:exportSession.progress animated:YES];
            if (done) {
                dispatch_source_cancel(timer);
                dispatch_release(timer);
                _self.exportingMovieLabel.hidden = YES;
                _self.exportingProgress.hidden = YES;
            }
        });

        dispatch_resume(timer);
    }

ARCではキューオブジェクトを解放する必要がないことを知りました。しかし、ディスパッチ ソースのような他の GCD オブジェクトはありますか?

4

2 に答える 2

10

いいえ、ここで説明されているように、デプロイ ターゲットが iOS 6.0 または Mac OS X 10.8 以降である場合に限ります。

すべての GCD オブジェクトは ARC によって管理されるため、メモリを明示的に管理する必要はありません。dispatch_queue_tに当てはまることは、他のすべての GCD オブジェクトにも当てはまります。

これは<os/object.h>、 の定義のすぐ上に記載されていますOS_OBJECT_HAVE_OBJC_SUPPORT

デフォルトでは、GCD や XPC オブジェクトなどの libSystem オブジェクトは、Objective-C コンパイラでビルドするときに Objective-C 型として宣言されます。これにより、ARC、Blocks ランタイムによる RR 管理、および静的アナライザーによるリーク チェックに参加できるようになり、Cocoa コレクションに追加できるようになります。

-DOS_OBJECT_USE_OBJC=0コンパイラ フラグを使用して、この動作をオプトアウトすることもできます。

于 2013-10-19T20:26:07.223 に答える
1

コードに追加するコンパイラ ディレクティブを次に示します。

// If GCD objects are treated as Objective C object then we do not need to call dispatch_release on those GCD object.
// Checking if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 ensures we are only releasing GCD objects when they are NOT being treated as Objective C objects.
#if OS_OBJECT_HAVE_OBJC_SUPPORT == 0
    dispatch_release(timer);
#endif
于 2015-07-07T21:18:57.203 に答える