グローバル変数とメソッドを利用するために、健全なコーディング手法として Singleton を実装しました。実装する前に、 Appleのドキュメント、ジョン・ワーズワースのブログに従いました。最初に、シングルトン スレッド セーフを作成せず、ブログと Apple のドキュメントで言及されている他のすべてのメソッドと共にこのメソッドを実装しました。
+ (SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[super allocWithZone:NULL] init];
}
return sharedManager;
}
その後、シングルトンをスレッドセーフにするために+ (SingletonClass *)sharedManager
、このようなクラスに変更を加えたところ、アプリの起動が停止しました。ブレークポイントを設定すると、dispatch_once
取得が 2 回呼び出され、コードの実行がさらに停止します。
+(SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager !=nil)
{
return sharedManager;
}
static dispatch_once_t pred;
dispatch_once(&pred, ^{
sharedManager = [SingletonClass alloc];
sharedManager=[sharedManager init];
});
return sharedManager;
}
このスレッド セーフ コード スニペットを削除して以前のコードに戻すと、問題なく動作し、コードが実行されます。
ここで、質問する前にデッドロックの可能性について言及しているbbum の回答も見ましたが、問題を理解することはできません。説明や解決策は私にとって役に立ちます。ありがとう。
編集1:
誰かが完全なコードを見たい場合に備えて、そのための要点を作成しました。そこに従ってください。ありがとう。