シングルトン パラダイムの-invalidate
ように、これらのコードが 1 回実行されるように、メソッドでシリアル キューを無効にするコードを保護する必要があります。dispatch_once
私の直感は次のとおりです。
@property(nonatomic, readonly, getter=isValid) BOOL valid;
@property(nonatomic) dispatch_queue_t serialQueue;
...
- (void)invalidate {
if ([self isValid]){
dispatch_sync(self.serialQueue, ^{
if ([self isValid]) {
_valid = NO;
// relinquish resources here
}
});
if (self.serialQueue) {
dispatch_release (self.serialQueue);
}
}
}
この-invalidate
メソッドは、明示的に、または によって呼び出され-dealloc
ます。そして、リソースが一度だけ放棄されるようにしたいと思います。
この実装はスレッドセーフですか?
dispatch_once
インスタンスごとにブロックを実装するより良い方法はありますか?
@property(nonatomic, readonly) dispatch_once_t invalidated;
...
- (void)invalidate {
dispatch_once(&_invalidated, ^{
dispatch_sync(logQueue, ^{
// double check
if (self.isValid) {
self.valid = NO;
// relinquish things
}
}
}
}