【问题标题】:Access property from a class method?从类方法访问属性?
【发布时间】:2011-08-11 22:02:04
【问题描述】:

为了使我的代码可测试,我创建了一个惰性初始化器;这样在我的单元测试中,我可以在调用 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

【问题讨论】:

  • 我想我要将我的类方法更改为常规方法,并在调用该方法之前对其进行实例化。 Grrrr Objective C 就是这么弱的语言。没有私有的、公共的、静态的、抽象的、虚拟的、受保护的、代码注释:(

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


【解决方案1】:

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

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

static WebService* webService;

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

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

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

【讨论】:

  • 术语说明:+Objective-C 中的方法是“类方法”,而不是“静态函数”。使用- 定义的方法是“实例方法”。
【解决方案2】:

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

<...>

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

有什么方法可以制作 我的班级可以访问的属性 方法?

没有。你必须以某种方式创建一个实例。

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

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

MyClass *my_inst;

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

external MyClass *my_inst;

【讨论】:

  • 我宁愿不使用单例,这在单元测试和模拟时会导致更多问题
【解决方案3】:

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

static NSString *name = @"Bob";

并声明一个类似的方法

- (NSString *)getName {
  return name;
}

从外部获取内部名称。这样就不用处理外部全局变量了……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多