0

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

4

1 回答 1

3

You don't want to override - init (if not for some other reason) - - init is not the method that creates the instance. You want to override + alloc for this:

@implementation SingletonClass

+ (id)alloc
{
    static id instance = nil;
    if (instance == nil) {
        instance = [super alloc];
    }
    return instance;
}

@end

This way you can actually prevent (almost) completely creating multiple instances of SingletonClass.

(Unless somebody falls back to calling

id trickyDifferentInstance = class_createInstance(objc_getClass("SingletonClass"), 0));

but that's very unlikely.)

于 2013-02-19T17:04:49.197 回答