强制删除使用dispatch_once创建的测试代码中的单例

时间:2013-05-10 21:55:07

标签: objective-c

我正在为模型类编写一些单元测试代码,并希望在app退出和重新启动期间模拟类的行为。我可以通过删除和重新分配对象来实现这一点,但是它是一个单例,因此下面的代码没有达到预期的效果:

+ (id) sharedInstance
{
    static MyModel *singleton = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^ {
        singleton = [[MyModel alloc] initSharedInstance];
    });
    return singleton;
}


// Test code:
    MyModel* gModel = [MyModel sharedInstance];
    ... tests
    gModel = nil;
    gModel = [MyModel sharedInstance];
    ... more tests

是否有一个简洁的解决方案,所以我可以删除/重新创建对象?

2 个答案:

答案 0 :(得分:2)

static MyModel *singleton = nil;
static dispatch_once_t onceToken;

+ (instancetype) sharedInstance
{
    dispatch_once(&onceToken, ^ {
        if (singleton==nil){
            singleton = [[MyModel alloc] initSharedInstance];
        }
    });
    return singleton;
}

+(void)setSharedInstance:(MyModel *)instance {
    onceToken = 0;
    singleton = instance;
}

无:

[MyModel setSharedInstance:nil];

请注意,您也可以将其设置为任意类来进行模拟。

[MyModel setSharedInstance:someMock];

答案 1 :(得分:1)

确保这样的事情对于单元测试来说没问题,你可以将它关闭为prod:

static MyModel *singleton = nil;

+ (id) sharedInstance
{   
   if(!singleton)
    {
        singleton = [self new];
    }
    return singleton;
}
+ (void)resetSingleton
{
    [singlelton release];
    singleton = nil;
}
相关问题