我在我的应用程序中使用一个 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
方法的约定是向其他开发人员传递此方法的隐含信息,但如果可能的话,我希望有更多的控制权。