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