【发布时间】:2013-07-16 01:50:01
【问题描述】:
这是我单身的代码
+ (ALData *)sharedInstance {
static ALData *_shared;
if(!_shared) {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^ {
_shared = [[super allocWithZone:nil] init];
});
}
return _shared;
}
+ (id)allocWithZone:(NSZone *)zone { return [self sharedInstance]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
#if (!__has_feature(objc_arc))
- (id)retain { return self; }
- (unsigned)retainCount { return UINT_MAX; }
- (void)release {}
- (id)autorelease { return self; }
#endif
现在,我见过的所有单身人士都以这种方式调用:
[[SINGLETON sharedInstance] instanceMethod];
但我想这样打电话:
[SINGLETON classMethod];
要在创建方法时执行此操作,我会这样做:
+ (BOOL)decide:(BOOL)var {
[self sharedInstance];
if (var)
return NO;
else
return YES;
}
相反,如果我想以第一种方式继续,我必须以这种方式声明我的方法:
- (BOOL)decide:(BOOL)var {
if (var)
return NO;
else
return YES;
}
当我调用它时,我必须写:
[[SINGLETON sharedInstance] decide:YES];
我的问题是:这两种方法有什么区别?无论是在性能方面,还是在设计模式层面。
我想知道这一点,因为我认为在美学上更好的方法是第二种方法,即不称为sharedInstance 的方法。
希望我的问题很清楚
【问题讨论】:
-
你的两个例子之间没有关系。第一个调用 Class 方法(不需要第一行,为什么要写那个?),另一个调用单例实例上的实例方法
-
糟糕的例子。您的
+decide:方法获取共享实例,不会将其分配给任何东西,并且无论如何都不需要该实例。您的-decide:方法也可能是一个类方法,因为它根本不依赖于对象的状态。请发布真实代码而不是虚假示例。 -
@MidhunMP 我不认为这很糟糕,为什么会很糟糕?而且,为什么这两个例子之间没有关系?一个是类方法,一个是实例方法,一个需要在sharedInstance之后调用,另一个可以作为类方法调用,因为调用sharedInstance本身。
-
@AndreaLufino:你为什么在类方法中调用
[self sharedInstance];?
标签: ios objective-c design-patterns singleton