考虑这段代码:
+(id)sharedInstance
{
static dispatch_once_t pred;
static MyClass *sharedInstance = nil;
dispatch_once(&pred, ^{
sharedInstance = [[MyClass alloc] init];
});
return sharedInstance;
}
如果我遵循这种单例设计模式,我可以做出以下假设:
- 由于 GCD,分配和初始化只会执行一次。
- sharedInstance 类变量只能在此实现中访问,并在类之间共享,而与实例无关。
第一次创建实例时,我会执行以下操作:
MyClass *something = [MyClass sharedInstance];
我的问题是,如果我再次调用预览代码,但像这样:
MyClass *somethingOther = [MyClass sharedInstance];
我只能想到一个结果。
结果:
static MyClass *sharedInstance = nil;
使 sharedInstance 类变量指向 nil 并返回一个 nil,因此 someOther 将是 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”?
谢谢