从类方法访问属性?

时间:2011-04-24 16:21:37

标签: objective-c static-variables class-method

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

但是,对于类方法,我的类方法无法访问我定义的属性。

  1. 有没有办法让我的类方法可以访问这些属性?
  2. 如果没有,有没有办法创建也可以在这个类之外访问的静态变量,即可以通过我的单元测试类访问?
  3. 
    @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
    

3 个答案:

答案 0 :(得分:6)

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

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

static WebService* webService;

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

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

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

答案 1 :(得分:3)

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

< ...>

UPD: 如果这种方式不可接受,请直接回答您的问题:

  

有没有办法让这个   我的班级可以访问的属性   方法

没有。您必须以某种方式创建实例。

  

如果没有,有什么办法可以创建   statis变量也是   在这堂课之外可以进入?   (可由我的单元测试类访问

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

MyClass *my_inst;

并在* .h文件中声明:

external MyClass *my_inst;

答案 2 :(得分:2)

或者您可以在.m上声明一个静态变量,例如

static NSString *name = @"Bob";

并声明类似

的方法
- (NSString *)getName {
  return name;
}

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