静态函数中奇怪的单例初始化在单元测试期间初始化

时间:2011-02-22 19:19:01

标签: objective-c unit-testing singleton static-initializer

我的单件类

中有以下代码
static MySingleton *gManager;
+(void)initialize
{
   if(self == [MySingleton class])
   {
       gManager = [[MySingleton alloc] initWithServices:[[MyServices alloc] init]];
   }
}
+(MySingleton *)sharedInstance
{
   return (gManager);
}

不幸的是,在单元测试期间,我看到gManager是SenTestCaseRun类型的实例。我似乎无法弄清楚为什么? 所以一个电话就好 [[MySingleton sharedInstance] myFunction];

导致myFunction是一个未知选择器的错误,尽管它存在于MySingleton类中。

它是SenTestCaseRun类型,因为我使用NSStringFromClass函数进行了检查。

任何指针?已经在这上面打了3-4个小时:(。

2 个答案:

答案 0 :(得分:1)

将初始化代码放在共享实例方法

中可能更好
+(MySingleton *)shared
{
    static MySingleton *sharedInstance = nil;
    if(sharedInstance == nil){
        sharedInstance = [[MySingleton alloc] init];
    }
    return sharedInstance;
}

同样在你的代码中你将一个对象与一个永远不会是真的类进行比较,而不是将[self class]与[MySingleton类]进行比较。

答案 1 :(得分:0)

+initialize中放置断点以确保正确设置此变量。如果这不能解释它,请在其上使用watchpoint来查看谁正在修改它。