[解決済み】AppleがARCでのシングルトンパターンの実装にdispatch_onceの使用を推奨するのはなぜですか?
2022-03-28 14:14:46
質問
ARCのシングルトンの共有インスタンスアクセッサでdispatch_onceを使用する正確な理由は何でしょうか?
+ (MyClass *)sharedInstance
{
// Static local predicate must be initialized to 0
static MyClass *sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[MyClass alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
シングルトンをバックグラウンドで非同期にインスタンス化するのはまずいのでは?つまり、私がその共有インスタンスを要求し、すぐにそれに頼ったとしても、 dispatch_once が私のオブジェクトを作成するためにクリスマスまでかかったらどうなるのでしょうか?それはすぐに返されないのですね?少なくとも、それがGrand Central Dispatchの全体的なポイントであるように思えます。
では、なぜこのようなことをするのでしょうか?
どうすれば解決するの?
dispatch_once()
は絶対に同期です。すべてのGCDメソッドが非同期で物事を行うわけではありません(例.
dispatch_sync()
は同期です)。の使用は
dispatch_once()
は、以下のイディオムに置き換わります。
+ (MyClass *)sharedInstance {
static MyClass *sharedInstance = nil;
@synchronized(self) {
if (sharedInstance == nil) {
sharedInstance = [[MyClass alloc] init];
}
}
return sharedInstance;
}
のメリットは
dispatch_once()
よりも速いということです。また、複数のスレッドが同時にsharedInstanceのalloc initを実行するのを防げるので、意味的にもすっきりしています。2つのインスタンスを作成することはできません。の全体の考え方は
dispatch_once()
というのは、一度だけ何かを実行し、一度だけしか実行しないということで、まさに私たちがやっていることはそれです。
関連
-
[解決済み】arm64アーキテクチャの未定義シンボルについて
-
[解決済み] Xcode 10でコマンドCompileSwiftが0以外の終了コードで失敗する [重複] 。
-
[解決済み] UITabBar アイコンが正しく表示されない
-
[解決済み] 指定されたホスト名を持つサーバーが見つからなかった
-
[解決済み] Xcode 4のBundle creator OS Type code ?
-
[解決済み] iOS 9 : ユニバーサルアプリの警告「アプリがフルスクリーンを必要としない限り、すべてのインターフェイスの向きをサポートする必要があります」。
-
[解決済み] Unwind segue - インスタンスメソッドのみ @IBAction を宣言でき、ボタンが Exit に接続しない
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み】PHP5でSingletonデザインパターンを作成する
-
[解決済み】プロジェクトをARC使用に変換する場合、「switch case is in protected scope」はどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】印刷します。エントリ, ":CFBundleIdentifier", Does Not Exist
-
[解決済み] 'strcmp' はこのスコープで宣言されていません。
-
[解決済み】"宣言はファイルスコープでのみ有効 "について
-
[解決済み】NSURLErrorDomainエラーコードの説明
-
[解決済み】クラスは両方で実装されており、どちらかが使用されることになります。どちらが未定義か
-
[解決済み] キャッチできない例外 'NSInvalidArgumentException', reason: '-[_.AppDelegate add:]: unrecognized selector' により、アプリを終了する。
-
[解決済み] 警告 xcode 6 で暗黙の変換により整数の精度が失われる
-
[解決済み] NSIntegerからNSStringデータ型に変換するにはどうすればよいですか?
-
[解決済み] ios8ではdidRegisterForRemoteNotificationsWithDeviceTokenは呼ばれないが、didRegister...Settingsは呼ばれる。
-
[解決済み] CocoaPodsでポッド「Firebase/Core」の互換バージョンが見つからなかった|cloud_firestore, Flutter