Objective C Singleton - 防止不止一次分配内存

时间:2013-02-19 16:58:18

标签: objective-c singleton

我在我的应用程序中使用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方法的惯例是其他开发人员通过这种方法的隐含信息,但如果可能的话我想要更多控制。

1 个答案:

答案 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));

但这不太可能。)