Objective-C中的单身混淆

Singleton confusion in Objective-C

考虑这样的代码:

1
2
3
4
5
6
7
8
9
+(id)sharedInstance
{
    static dispatch_once_t pred;
    static MyClass *sharedInstance = nil;
    dispatch_once(&pred, ^{
        sharedInstance = [[MyClass alloc] init];
    });
    return sharedInstance;
}

如果我跟这个singleton设计模式,我可以做以下假设:

  • 配置和初始化只会被执行一次谢谢!到最大公约数。
  • 在sharedinstance变量只能访问类是从在本实施和共享的类的实例,无论。

在我第一次创建这样的事情:我会的。

1
MyClass *something = [MyClass sharedInstance];

我的问题是,如果我调用的代码,但像这样:预览?

1
MyClass *somethingOther = [MyClass sharedInstance];

我只能想到一个结局。

结果:

1
static MyClass *sharedInstance = nil;

让sharedinstance变点零级和一somethingother无操作系统将返回零。

但我想说,什么是应该发生的,是在单件,而共享的实例将被返回。

现在考虑这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+ (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;    
}

这里的the

1
static MotionManagerSingleton *_sharedInstance;

我doesnt集变到零,但我认为,所有的对象都是零分,initialized到默认。

我的问题是,怎么是这类方法返回的"sharedinstance"?

好的,谢谢


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

1
static MotionManagerSingleton *_sharedInstance;

不会让你的motionmanagersingleton指向nil。它将指向未定义(垃圾)位置。

二。声明为static的变量只初始化一次(是的,语法与语义有点不一致),因此第一个实现不会使返回的共享实例无效。这是一个完美的实现。