0

ときどき、オブジェクトの存続期間中に1回コードを実行したいことがあります。以前、確認できるプロパティを設定しましたBOOLが、少し厄介です。これをエレガントに実現するObjective-Cに組み込まれているものはありますか?やや似dispatch_onceていますが、アプリケーションの存続期間ではなく、オブジェクトに関連付けられています。

4

2 に答える 2

2

アップルのドキュメント によると、dispatch_onceその場合は使用しないでください!

述部は、グローバルスコープまたは静的スコープに格納されている変数を指している必要があります。自動ストレージまたは動的ストレージで述部を使用した結果は未定義です。

別のアプローチは、不可分操作を使用することです。そうすることで、オブジェクトの存続期間中にコードが1回だけ実行されるようにすることもできます。

@implementation MyClass {
    // int32_t initialized;
    BOOL initialized;
}

- (void)myMethod {
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // if (OSAtomicTestAndSetBarrier(1, &initialized) == NO) {
        if (!initialized) {
           // do stuff once

           initialized = YES;
        }
    });
};

@end

編集:initializedタイプBOOLであり、ChrisDevereuxとStephenCanonのコメントのおかげで修正されました。

編集:Catfish_Manが指摘したように、不可分操作を使用すると問題が発生する可能性があります。そのため、dispatch_syncなどですべてをラップする必要があります。これにより、アトミック操作を使用しても意味がなくなります。

于 2013-07-23T10:45:53.637 に答える
1

これを行うには、dispatch_once_tインスタンス変数を使用できます。このオブジェクトを複数のスレッドで使用する場合は、微妙なスレッドの問題(dispatch_onceに固有ではない)に注意してください。オブジェクトが複数のスレッドに表示される前にivarの初期化が完了したことを確認するには、initの最後にメモリバリアが必要です。

于 2012-12-08T07:04:29.960 に答える