4

为了使我的代码可测试,我创建了一个惰性初始化器;这样在我的单元测试中,我可以在调用 getter 之前模拟我想要的任何对象。

但是,当涉及到类方法时,我的类方法无法访问我定义的属性。

  1. 有没有办法让我的类方法可以访问这些属性?
  2. 如果没有,有没有办法创建在这个类之外也可以访问的静态变量,即我的单元测试类可以访问?

@implementation
@synthesize webService;

+ (void)doSomething
{
   self.webService.url = @"some url";
   [self.webService start];
   // do other things
}

- (WebService*)webService
{
   if (!webService)
   {
      webService = [[WebService alloc] init];
   }
   return webService;
}

@end
4

3 回答 3

6

根据定义,类方法不能有状态,这意味着它不能访问应该是“实例”一部分的变量。在实例方法中(以“-”开头的方法),self 指针指的是正在调用该方法的实例,然而,在类方法中(以“+”开头的方法)中,“self”指的是类本身,而不是特定实例。这意味着无法直接访问属性。

但是,一种方法是在实现文件中创建类的静态实例:

static WebService* webService;

然后你会使用类似“sharedInstance”的方法来访问它,这样你就可以确保分配变量:

+(WebService*)sharedInstance
{
    if( nil == webService )
    {
        webService = [[WebService alloc] init];
    }
    return webService;
}

另一种选择是在您的实现文件中定义静态变量,然后创建类方法以从其他文件/类中设置和获取它们。

于 2011-04-24T16:33:46.363 回答
3

看起来你需要一个单身人士。

<...>

更新:如果这种方式不可接受,这里是您问题的直接答案:

有没有办法让我的类方法可以访问这些属性?

不,您必须以某种方式创建一个实例。

如果没有,有没有办法创建在这个类之外也可以访问的统计变量?(可由我的单元测试类访问

是的。您可以创建将保留实例的静态或全局变量。他们将可以从您的班级之外访问。静态变量在定义它的源文件中是可访问的;并且全局变量可以从任何地方访问。如果你想处理全局变量,你可以在 *.m 文件中定义它

MyClass *my_inst;

然后在 *.h 文件中声明:

external MyClass *my_inst;
于 2011-04-24T16:31:33.460 回答
2

或者你可以在你的上声明一个静态变量.m,比如

static NSString *name = @"Bob";

并声明一个方法

- (NSString *)getName {
  return name;
}

从外部获取内部名称。这样您就不必处理外部全局变量...

于 2016-11-25T22:55:05.197 回答