2017-09-20 21 views
0

我想弄清楚单身人士的最佳实施方案 这是我得到的最新版本。Objective-C单例执行

这是.m文件执行,什么毛病:

#import "Foo.h" 

static Foo *object = nil; 

@implementation Foo 

+ (Foo*)sharedObject { 
    return [[Foo alloc] init]; 
} 

- (id)init { 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     object = [super init]; 
    }); 

    return object; 
} 

@end 

,并使用它,我可以这样做:

[Foo sharedObject] 

[[Foo alloc] init] 

,都将返回相同的对象。

+0

你在做什么是一个不好的做法,这是做单身人士的错误方法。 'alloc init'必须总是返回一个实例,而不是一个懒惰的分配单例。请参阅@isamankumara回答正确的编码模式。 – Shebuka

+0

为什么你说这是必须的,我认为你的(必须)我的朋友是一个单身人士的敬意。这就是我写这个问题的确切原因。 singleton是这个类的唯一一个实例,否则它不是单例 –

回答

0

根据你的Foo类。当你调用两种方法时没有任何不同。 但我觉得更好,如果你可以改变你的Foo单身方法如下

+ (id) sharedObject { 
    static Foo *sharedobj = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedobj = [[self alloc] init]; 
    }); 
    return sharedobj; 
} 

- (id)init { 
    if (self = [super init]) { 
     someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; 
    } 
    return self; 
} 

让我们假设你想创建新实例。但是它不会使用alloc方法创建,因为您重写了init方法。

+0

我对你的解决方案的担心是我仍然能够创建一个实例,如果我调用了init方法,但是使用我的代码无论你是否调用了-init或+ s​​haredObject它仍然会返回相同的对象。并根据我对单体设计模式的理解,无论如何你都不应该能够创建这个类的另一个实例。 –