我在我的应用程序中使用sinlgeton来管理整个应用程序可用的数据,这些数据可通过以下方式访问:
static MMProductManager *sharedInstance = nil;
+(MMProductManager*)SharedInstance {
dispatch_once( &resultsToken, ^(void) {
if ( ! sharedInstance ) {
sharedInstance = [[MMProductManager alloc] init];
}
});
return sharedInstance;
}
一切都按预期工作。
在Objective C中,似乎没有办法隐藏任何对象的init
方法,而在我的情况下,只有MMProductManager
的实例会导致数据被复制(在最好的情况下)案例场景)。
我想做的是防止实例化多个实例。其他语言似乎有这个功能;即将某些方法/类标记为私有。我正在考虑实施类似的东西:
-(id)init {
// guard against instantiating a more than one instance
if ( sharedInstance )
return sharedInstance;
if ( (self = [super init]) ) {
self->_resultsQueue = dispatch_queue_create( kMMResultQLAbel, NULL );
self->_initialized = FALSE;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:UIApplicationDidReceiveMemoryWarningNotification
object:0];
[self initialize];
}
return self;
}
这种方法看起来合理吗?
如果有人分配此类,然后调用上述init
,会发生什么?覆盖+(id)alloc
是否合理?如果是这样我将如何做到这一点?
我知道公开SharedInstance
方法的惯例是其他开发人员通过这种方法的隐含信息,但如果可能的话我想要更多控制。
答案 0 :(得分:3)
您不想覆盖- init
(如果不是出于其他原因) - - init
不创建实例的方法。您想要覆盖+ alloc
:
@implementation SingletonClass
+ (id)alloc
{
static id instance = nil;
if (instance == nil) {
instance = [super alloc];
}
return instance;
}
@end
通过这种方式,您可以实际阻止(几乎)完全创建SingletonClass
的多个实例。
(除非有人回到调用
id trickyDifferentInstance = class_createInstance(objc_getClass("SingletonClass"), 0));
但这不太可能。)