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

Objective c 强制删除使用dispatch_创建的测试代码中的单例,objective-c,Objective C,我正在为一个模型类编写一些单元测试代码,并希望在应用程序退出和重新启动期间模拟该类的行为。我可以通过删除并重新分配对象来实现这一点,但是它是一个单例,因此以下代码没有达到预期效果: + (id) sharedInstance { static MyModel *singleton = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^ { singleton = [

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

+ (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

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

如果这样的解决方案适合单元测试,您可以在prod中关闭它:

static MyModel *singleton = nil;

+ (id) sharedInstance
{   
   if(!singleton)
    {
        singleton = [self new];
    }
    return singleton;
}
+ (void)resetSingleton
{
    [singlelton release];
    singleton = nil;
}
无:

[MyModel setSharedInstance:nil];
注意,您还可以将其设置为任意类来模拟它

[MyModel setSharedInstance:someMock];

请注意,这不是线程安全的,因为once令牌的重新初始化没有内存障碍
[MyModel setSharedInstance:someMock];