在Objective-c中在单例类上设置init可配置变量的好方法是什么?

时间:2013-04-15 18:05:59

标签: objective-c singleton

Nomaly我过去常常用以下方法构建单身:

+ (MyClass *)sharedInstance 
{       
    static MyClass *_sharedInstance = nil;
    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        _sharedInstance = [[self alloc] init];
        // Init variables
    });

    return _sharedInstance;
}

然后我可以调用以下方法:

[[MyClass sharedInstance] anyInstanceMethod];

但是,当任何init变量是来自课外的配置时会发生什么? 我的方法是创建两个类方法,其中一个包含可配置变量:

+ (MyClass *)sharedInstanceWithVariableOne:(NSString*)aParamOne andVariableTwo:(NSString*)aParamTwo 
{       
    static MyClass *_sharedInstance = nil;
    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        _sharedInstance = [[self alloc] init];

        // Init configurables variables
        _sharedInstance.paramOne = aParamOne;
        _sharedInstance.paramTwo = aParamTwo;
    });

    return _sharedInstance;
}

第二个作为最后一个的代理,默认值为:

   + (MyClass *)sharedInstance
    {       
        return [MyClass sharedInstanceWithVariableOne:@"value1" andVariableTwo:@"value2"];
    }

因此,如果要将singleton类与configure变量一起使用,则应首先调用sharedInstanceWithVariableOne:andVariableTwo,然后仅调用sharedInstance。 我认为这种方法不是最好的,我期待着使用其他方法。

提前致谢。

2 个答案:

答案 0 :(得分:3)

感谢您的快速回复。 正如你所说,它不是单身人士。 我将使用与[NSURLCache setSharedURLCache:][NSURLCache sharedURLCache]相同的行为。

接口

// MyClass.h
@interface MyClass : NSObject

+ (MyClass *)sharedMyClass;
+ (void)setSharedMyClass:(MyClass *)object;

- (id)initWithParamOne:(NSString)p1 andParamTwo:(NSString)p2;
@end

实施

// MyClass.m
@interface MyClass ()
@property(nonatomic, strong) NSString *paramOne;
@property(nonatomic, strong) NSString *paramTwo;
@end;

@implementation MyClass

static MyClass *_sharedInstance = nil;

+ (MyClass *)sharedMyClass
{
    if (_sharedInstance == nil) {
        _sharedInstance = [[MyClass alloc] initWithParamOne:@"value1" andParamTwo:@"value2"];
    }

    return _sharedInstance ;
}

+ (void)setSharedMyClass:(MyClass *)object
{
    _sharedInstance = object;
}

- (id)initWithParamOne:(NSString)p1 andParamTwo:(NSString)p2
{
    self = [super init];
    if (self) {
        _paramOne = p1;
        _paramTwo = p2;
    }

    return self;
}

然后我可以使用[[MyClass sharedMyClass] anyMethod]

答案 1 :(得分:1)

有很多方法可以设计共享实例之后的内容。 (它不是 singleton ,因为许多注释指出,因为必须只有一个类的实例。但是,这表示共享实​​例模式通常用作一个“穷人”的单身人士,没有直接调用任何init方法。回到问题......)也许以下内容适合你:

+ (void) setSharedInstanceParameterOne:(NSString*)aParamOne
                       andParameterTwo:(NSString*)aParamTwo 
{       
   MyClass *_sharedInstance = self.sharedInstance;
   _sharedInstance.paramOne = aParamOne;
   _sharedInstance.paramTwo = aParamTwo;
}

现在您使用[MyClass setSharedInstanceParameterOne:p1 andParameterTwo:p2]来设置/更改共享实例的参数,[MyClass sharedInstance](或MyClass.sharedInstance,尽管有些人可能会对此进行哲学讨论)来访问它。