シングルトンモードは、一般的に使用されるソフトウェア設計モードです。そのコア構造には、シングルトンと呼ばれる特別なクラスのみが含まれています。シングルトンパターンは、システム内にクラスのインスタンスが1つだけであることを保証できます。つまり、クラスには1つのオブジェクトインスタンスしかありません。ほとんどのシングルトンモデルの役割は、おそらく情報を共有し、センターを管理することです。シングルトンは、値の受け渡しにも使用できます。
開発プロセスでは、システムのいくつかのシングルトンを使用することがよくあります。
- [UIApplication sharedApplication]:アプリケーションのシンボル、UIApplicationオブジェクトはアプリケーションを表します
- [NSNotificationCenter defaultCenter]:通知
- [NSUserDefaults standardUserDefaults]:システムローカリゼーションストレージの方法
- [NSFileManager defaultManager]:ファイル操作
1.簡単な方法
OCで最も単純なシナリオのシングルトン方式
static Person *p = nil ;
+(instancetype)sharePerson{
if(p == nil){
p = [[Person alloc]init];
}
return p;
}
静的ポインタを作成します。ポインタがオブジェクトを指していない場合は、オブジェクトを作成し、ポインタにオブジェクトを保持させます。最後に、ポインタが保持しているオブジェクトを返します。静的であるため、ポインタによって保持されているオブジェクトは解放されず、このメソッドが呼び出されるたびに1つのオブジェクトのみが返されることが保証されます。これにより、シングルトンの目的が達成されますが、マルチスレッド環境でこのように記述することはお勧めしません。書き込みはスレッドセーフであることが保証されていません
2.オブジェクトのロック
キーワードを使用してオブジェクトをロックし、スレッドの安全性を確保します。これは、Appleが推奨するシングルトン実装方法の1つです。
+(instancetype)defaultPerson{
static Person *p = nil;
@synchronized (self) {
if (p == nil) {
p = [[Person alloc]init];
}
}
return p;
}
このコードはキューでのみ実行できます。これにより、シングルトンにオブジェクトが1つしかないことが完全に保証されます。
注意ミューテックスロックは、マルチスレッドの同時実行性に関連しています。基本的な意味は、複数のスレッドが同じコードに同時にアクセスすることです。これらは順番に実行する必要があり、同時に実行することはできません。これにより、マルチスレッドの安全性の問題を効果的に解決できます。
上記のメソッドを1回だけ実行しましたが、このメソッドを2回使用する場合でも、ifステートメントを実行する必要がありますか?全員がオブジェクトを作成した後も、オブジェクトは少しずつキューに入れられ、効率に大きな影響を与えます。したがって、開発者として、スレッドリソースを消費し、非効率的に実行することは発生しません。より良い方法があります。
3.GCD
GCD dispatch_onceを使用して、シーンオブジェクトのコードがプログラム全体の実行中に1回だけ実行されるようにします。
+(instancetype)sharePerson{
static Person *p = nil ;//1.声明一个空的静态的单例对象
static dispatch_once_t onceToken; //2.声明一个静态的gcd的单次任务
dispatch_once(&onceToken, ^{ //3.执行gcd单次任务:对对象进行初始化
if (p == nil) {
p = [[Person alloc]init];
}
});
return p;
}
注意 Dispatch_onceはGCDのオブジェクトです。この関数は、何度呼び出されても、内部ブロックが1回だけ実行されるようにして、コード実行の一意性を確保します。