运行测试时静态变量为零

时间:2014-12-10 12:38:52

标签: ios objective-c objective-c-runtime

我们有一个静态变量,默认值为:

static NSDictionary *g_primaryKeyFieldName = NULL;

我们在didFinishLaunchingWithOptions方法中使用适当的值初始化它。

g_primaryKeyFieldName = [NSDictionary dictionary...];

正常运行应用程序时,一切似乎都很好。但是,在运行测试时,变量会被初始化,但之后它的值会再次设置为初始NULL值。

我检查过该变量并未设置为nil或已取消分配,因为如果我将其默认值设置为其他值:

static NSDictionary *g_primaryKeyFieldName = @"Some String";

那就是变量得到的值。

可能导致此行为的原因是什么?

2 个答案:

答案 0 :(得分:2)

同样的问题刚好发生在我身上,我发现了一个可能的原因。如果文件(FCModel.m)包含在应用程序和测试目标中,则会为来自应用程序和测试的调用创建单独的上下文(静态变量等)。因此,解决方案是:确保FCModel.m文件仅在MyFCApp中具有目标成员资格,如果您需要在测试中访问FCModel类,则只能通过@testable import MyFCApp访问它。

答案 1 :(得分:-2)

static NSDictionary* g_primaryKeyFieldName = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    g_primaryKeyFieldName = @{
      @"k": @100,
      @"u": @400,
      @"m": @40,
      };
});