このコードを考えてみましょう:
+(id)sharedInstance
{
static dispatch_once_t pred;
static MyClass *sharedInstance = nil;
dispatch_once(&pred, ^{
sharedInstance = [[MyClass alloc] init];
});
return sharedInstance;
}
このシングルトンデザインパターンに従うと、次のように仮定できます。
- GCDのおかげで、割り当てと初期化は1回だけ実行されます。
- sharedInstanceクラス変数は、この実装内からのみアクセスでき、インスタンスに関係なくクラス間で共有できます。
初めてインスタンスを作成するときは、次のようにします。
MyClass *something = [MyClass sharedInstance];
私の質問は、プレビューコードをもう一度呼び出すと、次のようになります。
MyClass *somethingOther = [MyClass sharedInstance];
私はただ一つの結果を考えることができます。
結果:
static MyClass *sharedInstance = nil;
sharedInstanceクラス変数がnilを指すようにし、nilが返されるため、somethingOtherはnilになります。
しかし、シングルトンで発生するはずだったのは、代わりに共有インスタンスが返されることだと思いました。
ここで、このコードについて考えてみましょう。
+ (MotionManagerSingleton*)sharedInstance {
static MotionManagerSingleton *_sharedInstance;
if(!_sharedInstance) {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedInstance = [[super allocWithZone:nil] init];
});
}
return _sharedInstance;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
ここに
static MotionManagerSingleton *_sharedInstance;
変数をnilに設定していませんが、すべてのオブジェクトポインタがデフォルトでnilに初期化されていると思いました。
私の質問は、これらのクラスメソッドが「sharedInstance」をどのように返すのかということです。
ありがとう