2013-05-10 16 views
1

我正在为模型类编写一些单元测试代码,并希望在应用程序退出和重新启动期间模拟该类的行为。使用dispatch_once创建的测试代码中的单例强制删除

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

是否有一个巧妙的解决办法,所以我可以删除/重新创建对象:我可以通过删除和重新allocing的对象,但其独立的,并因此下面的代码不会产生预期的效果实现这一目标?

回答

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

请注意,这不是线程安全的,因为曾经令牌的重新初始化没有内存屏障 – 2013-05-10 23:31:03

1

确保这样的事情就可以了单元测试,你可以将其关闭PROD:

static MyModel *singleton = nil; 

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