0

考虑这段代码:

+(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”?

谢谢

4

1 回答 1

3

一。未初始化的指针是未初始化的。

static MotionManagerSingleton *_sharedInstance;

不会让您的 MotionManagerSingleton 指向nil. 它将指向一个未定义的(垃圾)位置。

二。声明的变量static仅初始化一次(是的,语法与语义有点不一致),因此您的第一个实现不会使返回的共享实例为空。这是一个非常好的实现。

于 2012-06-02T06:11:18.210 回答