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
。
我认为这种方法不是最好的,我期待着使用其他方法。
提前致谢。
答案 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
,尽管有些人可能会对此进行哲学讨论)来访问它。