为了使我的代码可测试,我创建了一个惰性初始化器;在我的单元测试中,我可以在调用getter之前模拟我想要的任何对象。
但是,对于类方法,我的类方法无法访问我定义的属性。
@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
答案 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;
}
从外部获取内部名称。这样您就不必处理外部全局变量...